Проблемы с производительностью при запуске хранимой процедуры - PullRequest
0 голосов
/ 18 января 2012

Я выполняю процедуру сохранения, которая занимает много времени, из-за чего мне нужно увеличить время ожидания почти до 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

1 Ответ

2 голосов
/ 18 января 2012

Вы можете использовать это, чтобы исключить слишком много сканирований таблицы кодов:

   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
...