Na minha experiência, a razão usual pela qual uma consulta é executada rapidamente no SSMS, mas lenta no .NET é devido a diferenças no
SET
da conexão -tings. Quando uma conexão é aberta por SSMS ou SqlConnection
, um monte de SET
comandos são emitidos automaticamente para configurar o ambiente de execução. Infelizmente SSMS e SqlConnection
tem SET
diferente padrões. Uma diferença comum é
SET ARITHABORT
. Tente emitir SET ARITHABORT ON
como o primeiro comando do seu código .NET. O SQL Profiler pode ser usado para monitorar qual
SET
comandos são emitidos por SSMS e .NET para que você possa encontrar outras diferenças. O código a seguir demonstra como emitir um
SET
comando, mas observe que este código não foi testado. 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.
}