什么一直在清理我的SQL Server计划缓存?

时间:2014-04-25 14:24:36

标签: sql-server caching sql-server-2008-r2

我们最近遇到了一些性能问题,所以我一直在密切关注我们的活动。我一直在运行AskBrent脚本并获得报告“有人运行DBCC FREEPROCCACHE”,因为计划缓存非常年轻。使用dm_exec_query_stats进一步深入研究我发现计划缓存每隔几秒钟就会频繁清空。我在服务器上运行了跟踪,并且在同一时间内没有任何运行任何DBCC命令。

任何人都知道还有什么可能导致计划缓存频繁清空?

数据库支持生产中的许多繁忙网站。在我们的暂存环境(运行相同的代码)中,计划缓存已有数天之久。在我们的开发环境中,缓存在几分钟或几个小时之间,这并不令人惊讶。我们在群集中运行SQL Server 2008 R2 Standard。

2 个答案:

答案 0 :(得分:7)

@Raspin:一种可能性是服务器受内存限制,并且有很多" distinct" SQL计划(未参数化或无法自动参数化的查询的执行)。

可能有这么多" new"计划和SQL服务器正在刷新" old"计划。 (DBCC FREEPROCCACHE以外的操作会导致计划被刷新。如果存在内存压力,那么不会重复使用的Adhoc计划将是从缓存中逐出的第一个计划。)

我推荐此Microsoft白皮书进行相关讨论:

http://technet.microsoft.com/en-us/library/ee343986(v=sql.100).aspx

我不确定"群集"影响计划缓存;我相信每个SQL Server实例都有它自己的计划缓存。


不能自动参数化的陈述"在白皮书附录A 的白皮书末尾列出。

我的猜测(只是猜测)是"不同的" SQL语句压倒了计划缓存。我冒昧地说很多陈述都没有被重复使用过。

在我的服务器上,我使用dm_exec_cached_plans在短时间内收集缓存[http://technet.microsoft.com/en-us/library/ms187404(v=sql.105).aspx]中的计划的一些快照,并比较快照。

条目数是否保持相对稳定,缓存是否已满,或者是否真正得到了清除"在某一点。是否重用了计划缓存中的任何语句? (我认为输出包含一个" usecounts"列,表示正在重新执行一个语句。)

我还会收集一小段短时间内正在执行的SQL语句,并对其进行审核。大多数语句是参数化还是自动参数化?或者他们中的大多数是有文字的单身人士。

SELECT *
  FROM sys.dm_exec_cached_plans
 WHERE cacheobjtype = 'Compiled Plan'
 ORDER BY objtype

大多数计划都是objtype =' Adhoc&#39 ;?如果计划不能重复使用,那么在出现内存压力时最容易被驱逐。


性能问题是否确实正在计划"清除"超出缓存,或者它真的是其他东西,比如SQL语句的庞大数量,SQL语句本身的性能,争用锁,锁存器,空闲缓冲区等等。


答案 1 :(得分:0)

您的集群是主动/主动还是主动/被动? 对于主动/被动群集,在实时切换失败时会看到此行为,因为sqlserver每次都重新启动。