几乎空的计划缓存

时间:2017-05-02 13:00:57

标签: sql-server performance

我遇到了一个奇怪的情况 - 我的计划缓存几乎是空的。我使用以下查询来查看其中的内容:

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

但没有一项建议/可能的原因是相关的。

1 个答案:

答案 0 :(得分:2)

  

问题的主要目的是了解空计划缓存的可能原因。

如果要学习,马丁史密斯的回答,the thread you referred will help you

如果你想特别了解,为什么计划被清空,我建议使用扩展事件并尝试下面的扩展事件

enter image description here