2013-07-31 37 views
0

這是我的存儲過程,即使使用本地數據庫運行也需要一些時間才能執行。需要提示以優化SQL Server存儲過程

請以提高性能

BEGIN TRY 
     DECLARE @COUNTRY_CD INT 
     SET @COUNTRY_CD =(SELECT COUNTRY_CD FROM COUNTRY WHERE COUNTRY_DESC = LTRIM(RTRIM(@COUNTRY_DESC))) 
     DECLARE @COMPANNY_CD INT 
     SET @COMPANNY_CD =(SELECT COMPANY_CD FROM COMPANY WHERE COMPANY_DESC = LTRIM(RTRIM(@COMPANY_DESC))) 
    BEGIN TRANSACTION 
     DELETE FROM PACK 
     WHERE COUNTRY_CD = @COUNTRY_CD 
       AND COMPANY_CD = @COMPANNY_CD 
       AND PACK_DESC = LTRIM(RTRIM(@PACK_DESC)) 
    COMMIT TRANSACTION 
END TRY 
BEGIN CATCH 
    IF(@@TRANCOUNT > 0) 
     ROLLBACK TRANSACTION 
    DECLARE @ErrMsg nvarchar(4000), 
      @ErrSeverity int 
    SELECT @ErrMsg = ERROR_MESSAGE(),@ErrSeverity = ERROR_SEVERITY() 
    RAISERROR(@ErrMsg, @ErrSeverity, 1) 
END CATCH 
+1

你是什麼**表結構ctures **(列,數據類型)?你在這些表上有哪些索引?這些表中有多少行數據? –

回答

0

很難說完全不知道更多關於您的數據庫模式。一些初步想法可能是立即清理* _DESC變量,而不是在WHERE子句中執行LTRIM和RTRIM。也許考慮或添加到包含COUNTRY_CD/COMPANY_CD的PACK表上的索引(儘管假設它是很長的字符串文本,但我認爲COMPANY和COUNTRY是非常小的表,但希望您在這些字段上有適當的索引。還值得嘗試加入到刪除這些表,而不是提前做的時間查找。

-- clenaup variables 
-- these should be new vars, not input parms 
SELECT @COUNTRY_DESC = LTRIM(RTRIM(@COUNTRY_DESC)) 
    ,@COMPANY_DESC = LTRIM(RTRIM(@COMPANY_DESC)) 
    ,PACK_DESC = LTRIM(RTRIM(@PACK_DESC)) 

-- delete 
DELETE PACK 
FROM PACK 
JOIN COUNTRY ON PACK.COUNTRY_CD = COUNTRY.COUNTRY_CD 
JOIN COMPANY ON PACK.COMPANY_CD = COMPANY.COMPANY_CD 
WHERE COUNTRY.COUNTRY_DESC = @COUNTRY_DESC 
AND COMPANY.COMPANY_DESC = @COMPANY_DESC 
AND PACK.PACK_DESC = @PACK_DESC 
+0

嗨,感謝您的答覆..嘗試了您的建議,但它也採取相同的時間執行 – Rohaan

+0

謝謝..做了一些小的改變,它幫助。 – Rohaan

1

嘗試評估變量的值@COUNTRY_CD和 @COMPANNY_CD在一個單獨的進程內,並通過他們的I/P參數來此 proc,看看它是否有幫助。我在過去曾見過這個問題,我剛纔提到的解決方案解決了這個問題。

0

確保公司被索引的company_cd,國家對country_cd和包裝上company_cd,country_cd,pack_desc。

從大表中刪除需要一段時間沒有正確的索引。

+0

嗨,我已經創建的索引上PACK表這樣'CREATE NONCLUSTERED INDEX [idx_pack_company_country_pack_desc] ON [DBO]。[PACK] ( \t [PACK_CD] ASC ) INCLUDE(\t [COMPANY_CD], \t [PACK_DESC] , \t [COUNTRY_CD])ON [PIR_INDEX = OFF,STATISTICS_NORECOMPUTE = OFF,SORT_IN_TEMPDB = OFF,DROP_EXISTING = OFF,ONLINE = OFF,ALLOW_ROW_LOCKS = ON,ALLOW_PAGE_LOCKS = ON] [主] GO'是正確的?並作爲company_cd和country_cd是主鍵,我認爲他們已經索引.. – Rohaan