计划“年龄”可以达到零吗?

Jam*_*oat 6 sql-server database-internals plan-cache

我正在阅读 Grant Friitchey 的 SQL Server 执行计划,他提到:

SQL Server 不会永远将执行计划保存在内存中。使用“年龄”公式将计划的估计成本乘以计划的使用次数,它们会慢慢地从系统中老化出来。lazywriter 进程是一个内部进程,用于释放所有类型的缓存(包括计划缓存),它会定期扫描缓存中的对象并每次将该值减一。

如果满足以下条件,将从内存中删除该计划:

  • 系统需要更多内存
  • 计划的“年龄”已经到了零
  • 该计划当前未被现有连接引用。

他还在书的前面提到了以下内容:

一旦优化器到达一个执行计划,估计的计划就会被创建并存储在一个称为计划缓存的内存空间中——尽管如果一个计划已经存在于缓存中,这一切都是不同的。

如果实际计划和估计计划不同,我会假设该计划理论上可以达到零。即使它存储在缓存中,这也会使估计的计划执行计数为零。

我的问题是计划年龄可以达到零的不同情况是什么?我的假设是否正确?

弗里奇,G.(2012 年)。SQL Server 执行计划。美国斯普林菲尔德:Simple Talk 出版。

Kin*_*hah 9

我的问题是计划的年龄何时可以达到零?

SQL Server 用于确定应何时以及如何从缓存中删除计划的算法称为驱逐策略。

分析计划的成本以确定哪些计划被驱逐。在检测到内存压力时,零成本计划从缓存中删除,所有其他计划的成本减少一半。

  • 对于临时计划,成本被认为是零,但每次重复使用计划时成本都会增加一。
  • 对于其他类型的计划,成本是对制定计划所需资源的衡量。当重复使用这些计划之一时,成本将重置为原始成本。
  • 对于非临时查询,成本以称为滴答的单位来衡量,最大为 31。成本基于三个因素:I/O、上下文切换和内存。在 31 个滴答总数中,每个都有自己的最大值。

当不在内存压力下时,直到所有缓存计划的总大小达到缓冲池大小的 50% 时,成本才会降低。那时,下一个计划访问将使所有计划的滴答成本减 1。

一旦遇到内存压力,SQL Server 将启动一个专用的资源监视器线程来减少一个特定缓存中的计划对象(对于本地压力)或所有计划缓存对象(对于全局压力)的成本。

所以要点是......

时钟算法定期扫描缓存。每次找到未使用的条目时,成本都会降低一些。如果成本为 0 且未使用,则将其从缓存中删除。

最佳参考: