In my experience the usual reason why a query runs fast in SSMS but slow from .NET is due to differences in the connection’s SET
-tings. When a connection is opened by either SSMS or SqlConnection
, a bunch of SET
commands are automatically issued to set up the execution environment. Unfortunately SSMS and SqlConnection
have different SET
defaults.
One common difference is SET ARITHABORT
. Try issuing SET ARITHABORT ON
as the first command from your .NET code.
SQL Profiler can be used to monitor which SET
commands are issued by both SSMS and .NET so you can find other differences.
The following code demonstrates how to issue a SET
command but note that this code has not been tested.
using (SqlConnection conn = new SqlConnection("<CONNECTION_STRING>")) {
conn.Open();
using (SqlCommand comm = new SqlCommand("SET ARITHABORT ON", conn)) {
comm.ExecuteNonQuery();
}
// Do your own stuff here but you must use the same connection object
// The SET command applies to the connection. Any other connections will not
// be affected, nor will any new connections opened. If you want this applied
// to every connection, you must do it every time one is opened.
}