查询在SQL Server中直接执行4秒,但在ASP.NET中需要> 30秒?

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并收集了一些统计信息.这就是我所观察到的.非常奇怪,它是正在执行的确切查询.让我知道在这一点上我还能做些什么.

在此输入图像描述

Leg*_*end 8

好; 最后,在这里这里找到答案.为方便起见,此处复制了答案.谢谢原版海报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复制了这些信息.