什么导致sql server为存储过程生成新计划?

DFo*_*k42 0 sql-server execution-plan sql-server-2016

我们已经在生产中遇到了几次问题,它看起来像一个存储过程获得了一个新的、糟糕的计划并开始造成严重破坏。不幸的是,在执行 dbcc freeproccache 之前,我们无法捕获之前和之后的计划以查看不良计划的情况,我们也没有设置查询存储。

我的问题是,什么会导致 sql server 为存储过程生成新计划?特别是对于一直运行的 sp。我知道的一些是:

  • dbcc freeproccache
  • 重新启动服务器
  • 选项重新编译

Sql*_*ide 6

对于 SQL 2016,这里列出了“statement_recompile_cause”可能发生的原因。

  • 架构已更改
  • 统计数据已更改
  • 延迟编译
  • 设置选项更改
  • 临时表已更改
  • 远程行集已更改
  • 对于已更改的浏览权限
  • 查询通知环境已更改
  • 分区视图已更改
  • 光标选项已更改
  • 请求选项(重新编译)
  • 参数化计划已刷新
  • 测试计划线性化
  • 影响数据库版本的计划已更改
  • 查询存储计划强制策略已更改
  • 查询存储计划强制失败
  • 查询存储缺少计划

对于支持扩展事件跟踪的任何其他版本,您可以获得相同的列表。

 Select 
  [name],
  map_key,
  map_value
FROM sys.dm_xe_map_values 
WHERE [name] ='statement_recompile_cause' 
Run Code Online (Sandbox Code Playgroud)

几个不错的参考:

  1. 一个很好的文章来读通过巴夫什·帕特尔
  2. StackOverflow 中的另一个问答
  3. 存储过程何时重新编译?(Sql Server)