运行存储过程时的性能问题

发布于 2024-12-27 13:53:32 字数 1373 浏览 1 评论 0原文

我正在运行一个存储过程,该过程需要花费很多时间,因此我必须将超时增加到近 3 分钟,任何人都可以提供有关如何减少存储过程执行时间的帮助,它工作得很好在100-500个代码上,但是当代码超过20000个时,它会变慢并需要长达3-4分钟,下面是sp,任何人都可以帮助我优化它。

@GUID uniqueidentifier
-- Insert statements for procedure here
SELECT     
        COUNT(Code.allocatedVendorID) AS Amt, 
        MIN(Code.dateAllocated) AS dateAllocated, 
        derivedtbl_1.startID, derivedtbl_2.endID, 
        tbVendor.name, 
        Code.unitCost, Code.isFree, Code.isAcademic, 
        Code.isVoided, Code.GUID, Code.expiryDate
FROM         
       Code 
        INNER JOIN
              (SELECT     MIN(CodeID) AS startID, GUID
                FROM          Code AS tbAccessCode_1
                GROUP BY GUID) AS derivedtbl_1 
                ON Code.GUID = derivedtbl_1.GUID 
        INNER JOIN
              (SELECT     MAX(accessCodeID) AS endID, GUID
                FROM          Code AS tbAccessCode_1
                GROUP BY GUID) AS derivedtbl_2 
                ON Code.GUID = derivedtbl_2.GUID 
        INNER JOIN  tbVendor 
            ON Code.allocatedVendorID = tbVendor.vendorID
WHERE     (Code.GUID = @GUID) AND (Code.allocatedVendorID > 0)
GROUP BY
        derivedtbl_1.startID, derivedtbl_2.endID, 
        tbVendor.name, 
        Code.unitCost, Code.isFree, Code.isAcademic, 
        Code.isVoided, Code.GUID, Code.expiryDate

ORDER BY dateAllocated DESC

I am running a store procedure which is taking a lot of time , due to which i have to increase the timeout to nearly 3 minutes, can any one provide assistance on how i can decrease the time for the store procedure to execute , it works fine on 100-500 codes but when the code exceeds to somehow 20000 , it slows up and takes upto 3-4 minutes , below is the sp, can anyone help me optimizing it.

@GUID uniqueidentifier
-- Insert statements for procedure here
SELECT     
        COUNT(Code.allocatedVendorID) AS Amt, 
        MIN(Code.dateAllocated) AS dateAllocated, 
        derivedtbl_1.startID, derivedtbl_2.endID, 
        tbVendor.name, 
        Code.unitCost, Code.isFree, Code.isAcademic, 
        Code.isVoided, Code.GUID, Code.expiryDate
FROM         
       Code 
        INNER JOIN
              (SELECT     MIN(CodeID) AS startID, GUID
                FROM          Code AS tbAccessCode_1
                GROUP BY GUID) AS derivedtbl_1 
                ON Code.GUID = derivedtbl_1.GUID 
        INNER JOIN
              (SELECT     MAX(accessCodeID) AS endID, GUID
                FROM          Code AS tbAccessCode_1
                GROUP BY GUID) AS derivedtbl_2 
                ON Code.GUID = derivedtbl_2.GUID 
        INNER JOIN  tbVendor 
            ON Code.allocatedVendorID = tbVendor.vendorID
WHERE     (Code.GUID = @GUID) AND (Code.allocatedVendorID > 0)
GROUP BY
        derivedtbl_1.startID, derivedtbl_2.endID, 
        tbVendor.name, 
        Code.unitCost, Code.isFree, Code.isAcademic, 
        Code.isVoided, Code.GUID, Code.expiryDate

ORDER BY dateAllocated DESC

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

怎言笑 2025-01-03 13:53:32

您可以使用它来消除代码表的过多扫描:

   SELECT     COUNT(Code.allocatedVendorID) AS Amt, 
              MIN(Code.dateAllocated) AS dateAllocated,      
              Code.startID, 
              Code.endID, 
              tbVendor.name, 
              Code.unitCost, Code.isFree, Code.isAcademic, 
              Code.isVoided, Code.GUID, Code.expiryDate
    FROM         
      (select Code.*,
            min(accessCodeID) over (partition by Code.GUID) startID,
            max(accessCodeID) over (partition by Code.GUID) endID
      from Code
      where (Code.GUID = @GUID) AND (Code.allocatedVendorID > 0)
      ) Code
    INNER JOIN
          tbVendor ON Code.allocatedVendorID = tbVendor.vendorID  
    GROUP BY  Code.startID, 
              Code.endID, 
              tbVendor.name, 
              Code.unitCost, Code.isFree, Code.isAcademic, 
              Code.isVoided, Code.GUID, Code.expiryDate
    ORDER BY dateAllocated DESC

You can use this to eliminate too many scans of Code table:

   SELECT     COUNT(Code.allocatedVendorID) AS Amt, 
              MIN(Code.dateAllocated) AS dateAllocated,      
              Code.startID, 
              Code.endID, 
              tbVendor.name, 
              Code.unitCost, Code.isFree, Code.isAcademic, 
              Code.isVoided, Code.GUID, Code.expiryDate
    FROM         
      (select Code.*,
            min(accessCodeID) over (partition by Code.GUID) startID,
            max(accessCodeID) over (partition by Code.GUID) endID
      from Code
      where (Code.GUID = @GUID) AND (Code.allocatedVendorID > 0)
      ) Code
    INNER JOIN
          tbVendor ON Code.allocatedVendorID = tbVendor.vendorID  
    GROUP BY  Code.startID, 
              Code.endID, 
              tbVendor.name, 
              Code.unitCost, Code.isFree, Code.isAcademic, 
              Code.isVoided, Code.GUID, Code.expiryDate
    ORDER BY dateAllocated DESC
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文