【问题标题】:sql runs fast in ssms slow in asp.netsql 在 ssms 中运行快 在 asp.net 中运行缓慢
【发布时间】:2012-04-27 20:37:40
【问题描述】:

我已经有这个问题几个星期了。问题是查询在网站上运行需要 4-5 分钟,而在 ssms 中运行最多需要 2 或 3 秒。我还发现,在更改此查询(例如添加 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

我在其他 2 个网站上运行相同的查询,它们运行良好。站点之间的唯一区别是它们在不同的数据库上运行,并且慢站点上的产品(54000 个产品)是其他两个站点的两倍多。所有三个站点及其数据库都托管在同一台机器上.

【问题讨论】:

  • 你应该标记一个答案。您很可能遇到参数嗅探问题

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


【解决方案1】:

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

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

【讨论】:

  • 如果您遇到问题的 相反 问题(在我的 EF Core 5 中快速而在 SSMS 中慢)查看此链接文档中的第 3.1 节并尝试创建一个临时存储过程来运行您的 SQL。
【解决方案2】:

查看您的 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

【讨论】:

【解决方案3】:

我有同样的问题,在我的情况下它与 MARS 有关,所以我从连接字符串中删除了MultipleActiveResultSets=True;,现在 SSMS 和 asp.net 的运行时间几乎相同(0.2 秒与之前的 4.5 秒相比)

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

【讨论】:

  • 这是我的问题的解决方案,我没有输入参数,但 SSMS 和我的应用程序之间的查询执行时间不同。从~7000ms 到 1000ms 执行时间。谢谢!
【解决方案4】:

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

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

【讨论】:

    【解决方案5】:

    不管怎样,我们偶尔也会遇到同样的问题;可能一年一次。您可以花一周时间阅读和消化其他答案中提到的所有精彩资源,或者您可以像我们一样做;停止并启动 SQL Server。

    这是一种享受。

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

    【讨论】:

      【解决方案6】:

      表变量和临时表在查询执行中有很大的不同

      我不确定你为什么要使用表变量,你可以试试这段代码,看看是否能解决你的缓慢之谜

      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
      

      【讨论】:

        【解决方案7】:

        你在使用任何 ORM 吗?如果您使用 NHibernate,您可以在 NHibernate 中启用数据库跟踪,看看可能是什么问题。以下是我在此类场景中观察到的一些场景:

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

        NHibernate 使用 log4net,你只需要添加一个 appender as mentioned here

        【讨论】:

          猜你喜欢
          • 2013-02-07
          • 2019-01-21
          • 2023-03-31
          • 1970-01-01
          • 2014-09-22
          • 2019-11-18
          • 1970-01-01
          相关资源
          最近更新 更多