System.Data.SqlClient.SqlCommand
我有一个存储过程,它从 Sql Server Management Studio 执行(2 秒)比运行时(2 分钟后超时)要快得多。
这可能是什么原因?
详细信息:在 Sql Server Management Studio 中,这将在 2 秒内运行(在生产数据库上):
执行 sp_Stat @DepartmentID = 空
在 .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
和 an SqlParameter
,但结果相同。
没有EXEC
它也是一样的结果。
在一个几乎没有数据的开发数据库上,这两种情况都在不到 1 秒的时间内完成。所以这与数据库中有很多数据有关,但它似乎只发生在.NET中......
Marc Gravell 所写的关于不同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
我学到了什么?也许使用分析器而不是猜测......
(起初的解决方案似乎与参数嗅探有关。但我混淆了一些东西......)