优化存储过程以获得更好的性能[关闭]

Posted

技术标签:

【中文标题】优化存储过程以获得更好的性能[关闭]【英文标题】:Optimising stored procedure for better performance [closed] 【发布时间】:2012-01-18 17:20:01 【问题描述】:

我正在使用大约需要一分钟才能执行的 SP;任何优化的想法?我使用的索引是accessCodeID,数据量在20k左右,

 SELECT COUNT(tbAC.abGUID) AS total,
       tbAC.abGUID,
       tbAC.aVID,
       tb_tt.used,

FROM   tbAC
       INNER JOIN (SELECT COUNT(abGUID) AS used,
                          abGUID
                   FROM   tbAC AS tbAC_1
                   WHERE  ( batchGUID = @id )
                          AND ( aVID > 0 )
                          AND ( isVoided = 0 )
                          AND ( isCodeUsed = 1 )
                   GROUP  BY abGUID) AS tb_tt
         ON tbAC.abGUID = tb_tt.abGUID
       INNER JOIN tbV
         ON tbAC.aVID = tbV.vendorID
WHERE  ( tbAC.aVID > 0 )
       AND ( tbAC.batchGUID = @id )
       AND ( tbAC.isVoided = 0 )
       AND ( lowLevelNotified = 0 )
GROUP  BY tbAC.abGUID,
          tbAC.aVID,
          tb_tt.used,
          tbV.name,
          tbV.firstName,
          tbV.lastName,
          tbV.tel,
          tbV.email,
          tbV.contactName  

【问题讨论】:

您必须提供更多信息,例如:表架构信息、现有索引、数据量,最好是查询计划。 请用信息编辑您的帖子,而不是在 cmets 中添加信息:) -1。投票关闭。如果您认为我们正在读懂您的想法,并且无法提供必要的信息来理解这一点 - 请尝试在麦当劳工作。至少发布您的硬件配置、查询执行计划和表定义。 我不明白这里的敌意,A 先生。虽然我们不能告诉你如何准确地解决这个问题,但我们当然可以就如何着手研究和解决它给你建议。 我要求的是建议而不是答案,因为我的查询有效,但它只是执行所需的时间,所以我正在寻找任何可以提高 d 查询性能的建议。跨度> 【参考方案1】:

这是我建议您尝试的一种方法。

在 Management Studio 中检查执行计划。 这将向您显示消耗最多时间和资源的地方。然后,您将知道,例如,您可能需要在表中添加索引的位置。

我将分别检查这两个查询。从嵌套查询开始。自行优化。然后,尝试在没有内部查询的情况下进行外部查询。然后,将它们放在一起。

如果您是视频爱好者,您可能会从this short one 以及那里引用的其他人那里获得一些帮助。

一旦您知道您正在寻找“执行计划”,您就可以在 Google 上搜索大量内容,并在 SO 中找到很多好问题。这是我为初学者找到的twoarticles。

【讨论】:

【参考方案2】:

假设allocatedVendorID在功能上依赖于abGUID,试试:

SELECT sum(case when lowLevelNotified = 0 then 1 else 0 end) AS total,
       tbAccessCode.abGUID,
       tbAccessCode.allocatedVendorID,
       sum(case when isCodeUsed = 1 then 1 else 0 end) AS used,
       tbV.name,
       tbV.firstName,
       tbV.lastName,
       tbV.tel,
       tbV.email,
       tbV.contactName
FROM   tbAccessCode
       INNER JOIN tbV
         ON tbAccessCode.allocatedVendorID = tbV.vendorID
WHERE  ( tbAccessCode.allocatedVendorID > 0 )
       AND ( tbAccessCode.batchGUID = 'abc-def' )
       AND ( tbAccessCode.isVoided = 0 )
GROUP  BY tbAccessCode.abGUID,
          tbAccessCode.allocatedVendorID,
          tbV.name,
          tbV.firstName,
          tbV.lastName,
          tbV.tel,
          tbV.email,
          tbV.contactName

【讨论】:

total 和 used columns 显示相同的结果 这很奇怪 - 你可以看到逻辑不同。它与旧查询的结果相比如何?如果添加 count(*) 列,将返回哪些数字?您可以在问题中添加一些示例数据吗? 我试过计数但没有区别,使用的显示正确的数量,但我想总数存在问题,因为它显示的数字与使用的数字相同 它与原始查询的输出相比如何? 它返回 36 行,而原来的返回 32 行,额外的 4 行是总 = 0 的那一行,它不在原始查询中,在问题中添加了图像

以上是关于优化存储过程以获得更好的性能[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

数据库查询优化

如何优化太慢的存储过程? [关闭]

如何删除 MS SQL Server 存储过程中的 While 循环? [关闭]

需要关于存储过程性能的建议[关闭]

优化asp.net应用程序中informix存储过程的性能?

存储过程花费的时间太长,有没有更好的方法来做到这一点/优化?