在我们的 SQL Server 2014 实例之一上,根据 sys.dm_exec_cached_plans 用于缓存计划的内存量与根据 sys.dm_os_memory_clerks 查看 CACHESTORE_SQLCP 类型(我理解)的内存量之间存在奇怪的差异用于即席查询缓存计划)。
如果我们查询缓存计划如下:
select cp.cacheobjtype, cp.objtype,
sum(cast(cp.size_in_bytes as money))/1024/1024 as sizeMB
from sys.dm_exec_cached_plans as cp
group by cp.cacheobjtype, cp.objtype;
Run Code Online (Sandbox Code Playgroud)
那么我们似乎总共有大约 90 MB 用于缓存计划,只有 2MB 用于临时计划。缓存中也只有 300 个计划。
但是,如果我们查看 dm_os_memory_clerks 视图如下:
select mc.type, mc.pages_kb/1024 as pagesMB
from sys.dm_os_memory_clerks as mc
where mc.type = 'CACHESTORE_SQLCP'
Run Code Online (Sandbox Code Playgroud)
然后它报告大约使用了 12 GB。我们的实例有大约。其中有 300 GB 的 RAM。
我们想了解这种差异,并在理想情况下采取一些措施来确保计划缓存得到有效使用(即其中有 300 多个计划以提高目前非常差的缓存命中率)。能够考虑这个空间将是第一步。
关于差异可能是什么以及为什么这个空间不被用于缓存计划的任何想法?