我有一个存储过程,它从 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中......
马克·格拉维尔 (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
is ...
SET ARITHABORT ON
我学到了什么?也许使用分析器而不是猜测......
(最初的解决方案似乎与参数嗅探有关。但我混淆了一些东西......)