我们有一个最大内存设置为 24GB 的 SQL Server 2016 SP1。
此服务器有大量编译,这些编译中只有 10% 来自 Ad-Hoc 查询。所以新编译的计划应该存储在计划缓存中,但计划缓存的大小没有增加(大约 3.72GB)。
我怀疑存在导致从缓存中删除计划的本地内存压力。计划缓存压力限制为 5GB。(75% 的可见目标内存从 0-4GB + 10% 的可见目标内存从 4GB-64GB + 5% 的可见目标内存>64GB)。当缓存存储达到压力限制的 75% 时,应从缓存中删除计划。在我的例子中,5 GB 的 75% 是 3.75 GB。所以这似乎是高编译的原因。
有没有办法衡量(perfmon,扩展事件,...)从缓存中删除计划?所以我可以确定本地内存压力真的是高编译的原因吗?
为此有一个 XEvent:
所以像:
此外,如果您的计划缓存有大量一次性计划,请考虑为临时工作负载设置优化。