【问题标题】:SQL Server performance fast only when refresh the stored procedure仅在刷新存储过程时 SQL Server 性能才快
【发布时间】:2013-07-16 16:31:45
【问题描述】:

我可以多次运行一个存储过程并且它不会命中它的缓存:(1665ms 是持续时间列)

但是如果我改变存储过程,什么都不改变:(240ms 是持续时间列)

问题:如何让存储过程始终保持快速(在第二次和下一次调用时)

【问题讨论】:

    标签: sql sql-server performance stored-procedures


    【解决方案1】:

    经过一番挖掘,我发现当我最初(重新启动后)使用 NULL applicationID 调用 SP 时

    exec [dbo].[usp_Tab32] @responsibleReviewerID=1135,@applicationID=NULL,@environment=1,@userUIStatus=0,@roleID=NULL
    

    然后使用更受限的查询:

    exec [dbo].[usp_Tab32] @responsibleReviewerID=1135,@applicationID=1406,@environment=1,@userUIStatus=0,@roleID=NULL

    这会很慢。

    但是,如果我先点击更受限的查询,那么两者都会很快。

    清除数据库计划缓存:

    DECLARE @dbId INTEGER
    SELECT @dbId  = dbid FROM master.dbo.sysdatabases WHERE name = ‘myDatabase’
    DBCC FLUSHPROCINDB (@dbId)
    

    更多详情here

    全部针对 SQL2012 开发版。

    【讨论】:

    • 值得一看:sommarskog.se/query-plan-mysteries.html 特别是 OPTIMIZE FOR 提示。清除整个计划缓存并不理想,因此如果您可以使用提示,它将帮助您处理更繁忙的系统。
    • 谢谢梅夫 - 同意!
    【解决方案2】:

    使用 RECOMPILE 创建您的存储过程并在运行时重新编译

    CREATE PROCEDURE yourprodecurename
    WITH RECOMPILE
    AS
        --your code here
    GO
    

    然后这样调用:

    EXEC yourprodecurename WITH RECOMPILE
    

    这应该会给您想要的体验,因为当第一次编译或重新编译过程时,过程查询计划会针对数据库的当前状态进行优化。

    这样可以提高程序的处理性能。

    【讨论】:

    • 非常感谢yeradis。就我而言,我发现这会降低性能。
    猜你喜欢
    • 1970-01-01
    • 2010-12-08
    • 2015-04-18
    • 1970-01-01
    • 1970-01-01
    • 2016-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多