衡量计划驱逐

Fre*_*gen 9 database-internals plan-cache sql-server-2016

我们有一个最大内存设置为 24GB 的 SQL Server 2016 SP1。
该服务器有大量编译,这些编译中只有 10% 来自 Ad-Hoc 查询。所以新编译的计划应该存储在计划缓存中,但计划缓存的大小没有增加(大约 3.72GB)。

我怀疑存在导致从缓存中删除计划的本地内存压力。计划缓存压力限制为 5GB。(0-4GB 可见目标内存的 75% + 4GB-64GB 可见目标内存的 10% + 可见目标内存的 5%>64GB)。当缓存存储达到压力限制的 75% 时,应从缓存中删除计划。就我而言,5 GB 的 75% 是 3.75 GB。因此,这可能是高编译的原因。

有没有办法测量(性能,扩展事件,...)从缓存中删除计划?所以我可以确定本地内存压力真的是高编译的原因吗?

Dav*_*oft 9

有一个 XEvent :

query_cache_removal_statistics

当查询计划从计划缓存中移除并且对象的历史统计信息即将被销毁时发生

所以像:

CREATE EVENT SESSION [PlanCacheEvictions] ON SERVER 
ADD EVENT sqlserver.query_cache_removal_statistics(
    ACTION(sqlserver.sql_text))
Run Code Online (Sandbox Code Playgroud)

此外,如果您的计划缓存有大量一次性计划,请考虑为临时工作负载设置优化