2013-02-26 45 views
4

我有一个查询(大约1600行存储为存储过程),在SQL Server Management Studio中执行时需要大约3秒钟的时间执行(通过添加正确的索引进行优化后)。查询在SQL Server中直接在4秒内执行,但在ASP.NET中需要超过30秒?

我在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()) 
     { 
     ... 
     } 
    } 
} 

我的连接字符串是:

Data Source={0};Initial Catalog={1};Integrated Security=True;MultipleActiveResultSets=true 

我知道查询本身是好的,因为我碰到这里面SSMS多次,它工作得很好(下平均5秒)。而且,我很乐意提供更多的调试信息,除了我不知道该提供什么。

要解决这些问题,我会从哪里开始?

编辑:

我跑SQL事件探查器,并收集了一些统计数据。这就是我所观察到的。很奇怪,它是正在执行的确切查询。让我知道在这一点上我还有什么可以做的。

enter image description here

+2

在哪条线和哪条线之间需要30秒? – 2013-02-26 20:35:46

+0

@MikeChristensen:它停在'cmd.ExecuteReader()'处。 – Legend 2013-02-26 20:36:50

+0

你是说SQL命令字符串是1600行,还是说它返回1600行? – RBarryYoung 2013-02-26 20:37:02

回答

8

好的;最后,找到答案herehere。为方便起见,在这里复制答案。非常感谢原始海报Jacques Bosch,他们从here开始。不能相信这个问题在2004年得到解决!

该问题似乎是由SQL Server的Parameter Sniffing引起的。 为了防止它,只需将您的传入参数值分配给SP顶部正确声明的其他变量。

See this nice Article about it

实施例:

CREATE PROCEDURE dbo.MyProcedure 
(
    @Param1 INT 
) 
AS 

declare @MyParam1 INT 
set @MyParam1 = @Param1 

SELECT * FROM dbo.MyTable WHERE ColumnName = @MyParam1 

GO 

我从eggheadcafe.com复制该信息。

0

为什么不u使用XML,而不是一个结果集? 据我所知,使用XML比读取结果集要快得多。 所以在这种情况下,你应该使用这样的事情:

SELECT * 
FROM [Table Name] 
FOR XML PATH('[Your Path]'), ELEMENTS XSINIL, ROOT('Your Root') 

之后,我觉得你可以在你的项目序列化。

0

我有同样的问题一次,事实证明,该差值被ARITHABORT设置,如果你通过SQL Management Studio中连接是不同造成的。在.NET连接ARITHABORT设置设置为OFF,而SQL Management Studio中设置此设置ON

你可以尝试,如果你必须在SQL Management Studio中执行SET ARITHABORT OFF同样的问题,然后执行查询。

Here is a thread解释了为什么这种设置可能会导致这种显着的性能差异。

相关问题