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 
+0

Какие показатели у вас на месте? – JNK

+0

Код и vendorID - это индекс –

+0

Множество подзапросов могут существенно повлиять на производительность. –

ответ

2

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

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 
+0

WILL TRY ND UPDATE U ON IT –

+0

обновленные небольшие опечатки в предложении Select –

+0

Неправильный синтаксис рядом с ключевым словом 'GROUP'. –