需要提示优化SQL Server存储过程

时间:2013-07-31 12:03:23

标签: sql sql-server-2008-r2

这是我的存储过程,即使使用本地数据库运行也需要一些时间来执行。

请提出更改以改善效果

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

4 个答案:

答案 0 :(得分:1)

  

尝试评估变量@COUNTRY_CD和的值   @COMPANNY_CD在一个单独的proc中,并将它们作为i / p参数传递给它   proc并看看它是否有帮助。我在过去和过去看过这个问题   我刚刚提到的解决方案解决了这个问题。

答案 1 :(得分:0)

尝试在存储过程中右键单击并检查估计执行计划。你可以看到你的SP会有多“昂贵”。

如果需要,你可以尝试

https://stackoverflow.com/a/797968/1504882

答案 2 :(得分:0)

如果不了解有关数据库架构的更多信息,很难说清楚。一些初步想法可能是立即清除* _DESC变量,而不是在WHERE子句中执行LTRIM和RTRIM。也许在PACK表上考虑或添加一个包含COUNTRY_CD / COMPANY_CD的索引(不过描述,假设它是长字符串文本。我认为COMPANY和COUNTRY是非常小的表,但希望你在这些字段上有适当的索引。同样值得尝试在DELETE中加入这些表,而不是提前进行查找。

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

答案 3 :(得分:0)

确保公司在company_cd,country_cd上的COUNTRY和company_cd,country_cd,pack_desc上的PACK上编入索引。

从没有正确索引的大表中删除会花费一些时间。