【问题标题】:Getting around cached plans in SQL Server 2005绕过 SQL Server 2005 中的缓存计划
【发布时间】:2011-03-22 20:55:41
【问题描述】:

有人可以解释一下为什么会这样吗?这里是风景。我有一个存储过程,它开始运行缓慢。然后我选择一个参数并声明一个变量来容纳它的值,并在 proc 中使用声明的变量而不是参数。然后proc将大大加快。

我认为这与缓存的计划和统计信息有关,但我不确定。是不是统计数据会随着数据库的增长和变化而过时,从而使缓存的计划针对与数据当前状态不同的数据过去状态进行优化?

谢谢。

【问题讨论】:

    标签: sql-server sql-server-2005 query-optimization sql-execution-plan parameter-sniffing


    【解决方案1】:

    您所描述的通常被称为parameter sniffing,它似乎是 SQL Server 唯一的问题 - 在 Oracle IME 上从未遇到过,我也不知道 MySQL 上的问题。我提供的链接很好地解决了这个问题。

    请注意,优化器使用的统计信息不会与数据更改同步 - 您可能还需要偶尔运行 UPDATE STATISTICS

    【讨论】:

    • OMG - 感谢您的回答,您的链接给了我正在寻找的解释。
    【解决方案2】:

    当您更改 ddl 时,存储过程执行计划将从缓存中删除,但正如 OMG Ponies 所说,优化器不会跟踪数据更改。

    解决此问题的一种方法是使用 With Recompile 选项,每次运行时都会编译该过程。另一种可能的解决方案是定期运行 sp_recompile,这会将存储过程标记为重新编译。

    【讨论】:

    • IIRC 重新编译也会抛出查询计划,保证硬解析
    • Giorgi,感谢您抽出宝贵时间回答我的问题。
    猜你喜欢
    • 2012-01-09
    • 1970-01-01
    • 2010-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多