我遇到了一个奇怪的情况 - 我的计划缓存几乎是空的。我使用以下查询来查看其中的内容:
SELECT dec.plan_handle,qs.sql_handle, dec.usecounts, dec.refcounts, dec.objtype
, dec.cacheobjtype, des.dbid, des.text,deq.query_plan
FROM sys.dm_exec_cached_plans AS dec
join sys.dm_exec_query_stats AS qs on dec.plan_handle=qs.plan_handle
CROSS APPLY sys.dm_exec_sql_text(dec.plan_handle) AS des
CROSS APPLY sys.dm_exec_query_plan(dec.plan_handle) AS deq
WHERE cacheobjtype = N'Compiled Plan'
AND objtype IN (N'Adhoc', N'Prepared')
有一刻,它显示了82行,下一个50,然后是40然后是55,依此类推,而在我无法到达计划缓存结束发出相同命令的一小时之前。关键是SQL Server保持计划缓存非常小。 我的调查的主要原因是高CPU与没有任何高负载的基线相比,在正常的白天工作负载下 - 持续65-80%
Perfmon计数器显示计划高速缓存命中率的低值 - 大约30-50%,高编译 - 每秒2000次批量请求中的400次和高CPU - 73次平均值。什么可能导致这种行为?
问题的主要目的是了解空计划缓存的可能原因。
内存正常 - 分钟:0最大值:245000。
我也没有注意到内存压力的任何迹象 - PLE,懒惰写道,免费列表停止磁盘活动都没关系,日志没有告诉我一件事。 我来这里是因为可能的原因所以我可以继续调查。
编辑:我也考虑过这个帖子:SQL Server 2008 plan cache is almost always empty
但没有一项建议/可能的原因是相关的。
答案 0 :(得分:2)
问题的主要目的是了解空计划缓存的可能原因。
如果要学习,马丁史密斯的回答,the thread you referred will help you
如果你想特别了解,为什么计划被清空,我建议使用扩展事件并尝试下面的扩展事件