У меня есть хранимая процедура, которая выполняется из Sql Server Management Studio намного быстрее (2 секунды), чем при System.Data.SqlClient.SqlCommand
(время ожидания истекло через 2 минуты).
В чем может быть причина этого?
Подробнее:
В Sql Server Management Studio это выполняется за 2 секунды (в рабочей базе данных):
EXEC sp_Stat
@DepartmentID = NULL
В .NET / C # следующие промежутки времени после 2 минут (в производственной базе данных):
string selectCommand = @"
EXEC sp_Stat
@DepartmentID = NULL";
string connectionString = "server=***;database=***;user id=***;pwd=***";
using (SqlConnection connection = new SqlConnection(connectionString))
{
using (SqlCommand command = new SqlCommand(selectCommand, connection))
{
connection.Open();
using (SqlDataReader reader = command.ExecuteReader())
{
while (reader.Read())
{
}
}
}
}
Я также пытался с selectCommand = "sp_Stat"
, CommandType = StoredProcedure
и SqlParameter
, но это тот же результат.
И без EXEC
результат тот же.
В почти пустой базе данных разработки оба случая заканчиваются менее чем за 1 секунду. Так что это связано с тем, что в базе данных много данных, но, похоже, это происходит только из .NET ...
То, что Марк Гравелл написал о различных значениях SET
, имеет значение в представленном случае.
SQL Server Profiler показал, что Sql Server Management Studio выполняет следующие SET
, что не делает .NET Sql Client Data Provider:
SET ROWCOUNT 0
SET TEXTSIZE 2147483647
SET NOCOUNT OFF
SET CONCAT_NULL_YIELDS_NULL ON
SET ARITHABORT ON
SET LOCK_TIMEOUT -1
SET QUERY_GOVERNOR_COST_LIMIT 0
SET DEADLOCK_PRIORITY NORMAL
SET TRANSACTION ISOLATION LEVEL READ COMMITTED
SET ANSI_NULLS ON
SET ANSI_NULL_DFLT_ON ON
SET ANSI_PADDING ON
SET ANSI_WARNINGS ON
SET CURSOR_CLOSE_ON_COMMIT OFF
SET IMPLICIT_TRANSACTIONS OFF
SET QUOTED_IDENTIFIER ON
SET NOEXEC, PARSEONLY, FMTONLY OFF
Когда я включил их, один и тот же запрос занимал одинаковое количество времени в SSMS и .NET.
И ответственный SET
это ...
SET ARITHABORT ON
Что я узнал? Может быть, использовать профилировщик вместо того, чтобы угадывать ...
(Сначала казалось, что решение связано с анализом параметров. Но я кое-что перепутал ...)