Leg*_*end 4 .net c# sql sql-server-2008
在SQL Server Management Studio中执行时,我有一个查询(大约1600行存储为存储过程),执行大约需要3秒(在通过添加正确的索引进行优化之后).
我在C#中为此编写了一个包装器,并为自己提供了使用URI来执行此查询的能力.但是,这需要超过30秒的时间来执行,因此,当我将此查询作为循环的一部分运行时,由于过多的待处理请求,浏览器会停止.我写了这样的包装器:
try
{
string ConString = Constants.connString;
using (con = new SqlConnection(ConString))
{
cmd = new SqlCommand(sql, con);
con.Open();
dr = cmd.ExecuteReader();
while (dr.Read())
{
...
}
}
}
Run Code Online (Sandbox Code Playgroud)
我的连接字符串是这样的:
Data Source={0};Initial Catalog={1};Integrated Security=True;MultipleActiveResultSets=true
Run Code Online (Sandbox Code Playgroud)
我知道查询本身很好,因为我在SSMS中多次运行它并且工作正常(平均5秒以下).而且,我很乐意提供更多的调试信息,除了我不知道提供什么.
要解决这些问题,我将从哪里开始?
编辑:
我运行了SQL Profiler并收集了一些统计信息.这就是我所观察到的.非常奇怪,它是正在执行的确切查询.让我知道在这一点上我还能做些什么.

好; 最后,在这里和这里找到答案.为方便起见,此处复制了答案.谢谢原版海报Jacques Bosch,后者又从这里拿走了它.无法相信这个问题在2004年得到了解决!
问题似乎是由SQL Server的参数嗅探引起的.要防止它,只需将传入的参数值分配给SP顶部声明的其他变量.
例:
CREATE PROCEDURE dbo.MyProcedure
(
@Param1 INT
)
AS
declare @MyParam1 INT
set @MyParam1 = @Param1
SELECT * FROM dbo.MyTable WHERE ColumnName = @MyParam1
GO
Run Code Online (Sandbox Code Playgroud)
我从eggheadcafe.com复制了这些信息.