【问题标题】: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 查询性能的建议。跨度>

标签: sql sql-server-2008 stored-procedures query-optimization relational-database


【解决方案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 的那一行,它不在原始查询中,在问题中添加了图像
    猜你喜欢
    • 1970-01-01
    • 2021-05-10
    • 1970-01-01
    • 2011-01-20
    • 2015-01-08
    • 1970-01-01
    • 1970-01-01
    • 2013-11-03
    • 1970-01-01
    相关资源
    最近更新 更多