sql在asp.net中以ssms运行速度很快

时间:2012-04-16 13:50:45

标签: sql asp.net .net sql-server-2008 ssms

我这个问题已经存在了几个星期了。问题是查询需要4-5分钟才能在网站上运行,最多需要2或3秒才能在ssms中运行。此外,我发现在对此查询进行更改后,例如添加customerId变量,它将在网页上快速开始运行,但到第二天它再次变慢。有问题的查询是这样的:

DECLARE @customerID INT
SET @customerID = @CustID
DECLARE @MyTable table(
Iden int NOT NULL IDENTITY(1,1),
ProductID int)

INSERT INTO @MyTable(ProductID)
SELECT P.ProductID FROM Product P WITH (NOLOCK)
left join Compunix_ProductMMY cpmmy with (nolock) on p.ProductID = cpmmy.ProductID
left join Compunix_CustomerMMY ccmmy with (nolock) on ccmmy.mmyid = cpmmy.mmyid
WHERE P.Deleted=0 AND P.Published=1 and (ccmmy.customerid = @customerID OR cpmmy.productid IS NULL)

SELECT c.Name, c.SeName, c.CategoryID
FROM Category c WITH (NOLOCK) 
JOIN ProductCategory PC With (NOLOCK) ON C.CategoryID = PC.CategoryID
JOIN @MyTable MT ON PC.ProductID=MT.ProductID
WHERE C.Published = 1
GROUP BY c.Name, c.SeName, c.CategoryID
ORDER BY c.Name

我在另外两个网站上运行相同的查询,工作得很好。这些站点之间的唯一区别是它们运行在不同的数据库上,慢速站点上的产品(54000个产品)比其他站点多一倍。所有三个站点及其数据库都托管在同一台机器上

7 个答案:

答案 0 :(得分:21)

您可能会遇到参数嗅探问题。

我建议阅读Erland Sommarskog的Slow in the Application, Fast in SSMS?来全面了解这个问题(长篇文章但非常好)。

答案 1 :(得分:8)

查看ASP.Net应用程序和SSMS会话的sys.dm_exec_sessions。我猜测至少有一个SET设置不同。这可能导致不同的计划(最终这归因于参数嗅探),并且应用程序方面通常最终会变得更糟。

有关详细信息,请参阅其他问题:

Stored procedure slow when called from web, fast from Management Studio

Procedure times out from ADO.NET but not in SSMS

Query times out when executed from web, but super-fast when executed from SSMS

ADO .NET vs. SQL Server Management Studio - ADO performs worse

答案 2 :(得分:2)

我遇到了同样的问题,在我的情况下,它与MARS有关,因此我从连接字符串中删除了MultipleActiveResultSets=True;,现在运行时间几乎相同(相较于4.5s,相差0.2s)

  

注意:MARS =多个活动结果集。如果在连接字符串上设置此属性,则可以以交错方式在同一连接上运行多个查询。它的主要目的是允许您在遍历结果集时提交UPDATE语句。

答案 3 :(得分:2)

同时执行以下步骤对我有用。

  1. 尝试重新编译存储过程
  2. 清除计划缓存
  3. 更新数据库的统计数据

答案 4 :(得分:0)

为了它的价值,偶尔我们会遇到同样的问题;可能是一年一次。你可以花一周时间阅读和消化其他答案中提到的所有这些美妙的资源,或者你可以做我们做的事情;停止并启动SQL Server。

这是一种享受。

我们注意到这个问题通常发生在各种schema / sp / view mod之后,这些mod可能与手头的问题没有直接关系。

答案 5 :(得分:0)

您是否使用任何orm?如果您使用的是nhibernate,则可以在nhibernate中启用数据库跟踪,看看可能是问题所在。以下是我在这种情况下观察到的一些情况:

  1. 隐式转换会导致错误的计划选择(使用nvarchar代替varchar)。您可以在其日志中观察nhibernate参数映射。
  2. 缺乏索引

Nhibernate使用log4net,您只需要添加一个此处所述的追加器即可: https://devio.wordpress.com/2010/04/14/logging-sql-statements-generated-by-nhibernate/

答案 6 :(得分:0)

表变量和临时表对查询执行有很大的影响

我不知道你为什么要使用 table 变量,你可以试试这个代码,看看是否能解决你的缓慢之谜

DECLARE @customerID INT
SET @customerID = @CustID

SELECT c.Name, c.SeName, c.CategoryID
FROM Category c WITH (NOLOCK) 
JOIN ProductCategory PC With (NOLOCK) ON C.CategoryID = PC.CategoryID
JOIN (SELECT P.ProductID FROM Product P WITH (NOLOCK)
        left join Compunix_ProductMMY cpmmy with (nolock) on p.ProductID = cpmmy.ProductID
        left join Compunix_CustomerMMY ccmmy with (nolock) on ccmmy.mmyid = cpmmy.mmyid
        WHERE P.Deleted=0 AND P.Published=1 and (ccmmy.customerid = @customerID OR cpmmy.productid IS NULL)
        ) MT ON PC.ProductID=MT.ProductID
WHERE C.Published = 1
GROUP BY c.Name, c.SeName, c.CategoryID
ORDER BY c.Name