Ras*_*pin 10 sql-server caching sql-server-2008-r2
我们最近遇到了一些性能问题,所以我一直在密切关注我们的活动.我一直在运行AskBrent脚本并获得报告"有人运行DBCC FREEPROCCACHE",因为计划缓存非常年轻.使用dm_exec_query_stats进一步深入研究我发现计划缓存每隔几秒就会频繁清空.我在服务器上运行跟踪,并且在同一时间段内没有任何运行任何DBCC命令.
任何人都知道还有什么可能导致计划缓存如此频繁地清空?
该数据库支持生产中的许多繁忙网站.在我们的暂存环境(运行相同的代码)中,计划缓存已有数天之久.在我们的开发环境中,缓存在几分钟或几个小时之间,这并不令人惊讶.我们在群集中运行SQL Server 2008 R2 Standard.
@Raspin:一种可能性是服务器受内存限制,并且存在许多"不同的"SQL计划(未参数化或无法自动参数化的查询的执行).
可能有很多"新"计划,SQL服务器正在刷新"旧"计划.(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
Run Code Online (Sandbox Code Playgroud)
大多数计划是objtype ='Adhoc'吗?如果计划没有得到重复使用,那么当存在内存压力时,最有可能被驱逐出去.
性能问题确实是计划被"清除"出缓存,或者它真的是其他东西,比如SQL语句的庞大数量,SQL语句本身的性能,争用锁,锁存器,空闲缓冲区,等等
| 归档时间: |
|
| 查看次数: |
4747 次 |
| 最近记录: |