我正在阅读 Grant Fritchey 的 SQL Server 执行计划,他提到:
SQL Server 不会永远将执行计划保存在内存中。使用“年龄”公式将计划的估计成本乘以计划的使用次数,它们就会慢慢从系统中老化出来。lazywriter 进程是一个内部进程,负责释放所有类型的缓存(包括计划缓存),它会定期扫描缓存中的对象,每次将此值减一。
如果满足以下条件,该计划将从内存中删除:
- 系统需要更多内存
- 计划的“年龄”已为零
- 该计划当前未被现有连接引用。
他还在本书的前面提到了以下内容:
一旦优化器得出一个执行计划,估计的计划就会被创建并存储在一个称为计划缓存的内存空间中——尽管如果计划已经存在于缓存中,这一切都是不同的。
如果实际计划和估计计划不同,我会假设该计划理论上可以达到零。这将使估计的计划执行计数为零,即使它存储在缓存中也是如此。
我的问题是计划年龄可能达到零的不同情况有哪些?我的假设是否正确?
Fritchey, G. (2012)。SQL Server 执行计划。美国斯普林菲尔德:Simple Talk Publishing。
SQL Server 用来确定何时以及如何从缓存中删除计划的算法称为逐出策略。
分析计划的成本以确定哪些计划被驱逐。在检测到内存压力时,零成本计划将从缓存中删除,所有其他计划的成本减少一半。
所以要点是...
时钟算法定期扫描缓存。每次找到未使用的条目时,成本都会降低一定数量。如果成本为 0 且未使用,则将其从缓存中删除。
最佳参考:
根据Grant Fritchey 的 Simple Talk 文章
所以你可以看到计划被重用的次数越多,它的年龄越大,它被删除的机会就越小。
因此,当创建计划并且在创建后被引用 0 次时,考虑到其他因素,该计划最终将被删除。我确信我所写的内容还有很多,可以从SQL Server 2008 执行计划和重用中找到。
我引用的是 BOL 文档