【问题标题】:Need tips to optimize SQL Server stored procedure需要技巧来优化 SQL Server 存储过程
【发布时间】:2013-07-31 22:45:14
【问题描述】:

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

请提出更改建议以提高性能

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

【问题讨论】:

  • 你是什么表结构(列、数据类型)?你在这些表上有哪些索引?这些表中有多少行数据?

标签: sql sql-server-2008-r2


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    如果不了解您的数据库架构,很难准确地说出。一些初步想法可能是立即清理 *_DESC 变量,而不是在 WHERE 子句中执行 LTRIM 和 RTRIM。也许考虑或添加到包含 COUNTRY_CD/COMPANY_CD 的 PACK 表上的索引(虽然不是描述,假设它是长字符串文本。我认为 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】:

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

    有需要可以试试

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

    【讨论】:

      【解决方案4】:

      确保 COMPANY 在 company_cd 上被索引,COUNTRY 在 country_cd 上,PACK 在 company_cd、country_cd、pack_desc 上。

      如果没有正确的索引,从大表中删除需要一些时间。

      【讨论】:

      • 嗨,我已经像这样CREATE NONCLUSTERED INDEX [idx_pack_company_country_pack_desc] ON [dbo].[PACK] ( [PACK_CD] ASC ) INCLUDE ( [COMPANY_CD], [PACK_DESC], [COUNTRY_CD]) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] GO 在 PACK 表上创建了索引,对吗?由于 company_cd 和 country_cd 是主键,我认为它们已经被索引了..
      猜你喜欢
      • 2018-02-06
      • 1970-01-01
      • 2010-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-18
      相关资源
      最近更新 更多