SQL DMV查询&缓存计划

时间:2010-07-19 13:23:30

标签: sql-server

我的理解是SQL Server中的某些DMV依赖于缓存的查询计划。我的问题是这些。是否缓存了所有查询计划?如果没有,什么时候查询计划没有缓存?对于缓存的缓存,它们在缓存中保留多长时间?

非常感谢

2 个答案:

答案 0 :(得分:2)

一些捕获与查询计划缓存直接相关的令牌的SQL Server DMV受到查询计划缓存的内存压力的影响(由于特殊查询,其他内存使用和高活动,或通过重新编译) )。查询计划缓存受到计划老化的影响(例如,成本为10且已被引用5次且“年龄”值为50的计划):

如果符合以下条件,则会从内存中删除该计划:

·系统需要更多内存

·该计划的“年龄”已达到零

·现有连接当前未引用该计划 Ref

那些与查询计划缓存没有直接关系的DMV在“常规”内存压力(缓存数据页)下刷新,或者重新启动sql server服务。

自SQL Server 2000以来,影响查询计划缓存的因素略有变化.SQL Server 2008的最新参考位于:Plan Caching in SQL Server 2008

答案 1 :(得分:0)

我只想添加一些极客细节:查询计划缓存利用SQL Server的常规缓存机制。这些缓存使用Clock algorithm进行驱逐,请参阅Q and A: Clock Hands - what are they for。对于查询计划高速缓存,条目的成本考虑了创建高速缓存条目所需的时间,IO和内存。

  

对于缓存的内容,需要多长时间   他们留在缓存中?

有效对象保留在缓存中,直到时钟指针将成本减少到0.请参阅sys.dm_os_memory_cache_clock_hands。这个问题没有绝对的时间答案,时钟指针可以在一秒钟内,一小时内,一周内或一年内将一个条目减少到0。这一切都取决于条目的初始成本(查询/模式复杂性),重用计划的频率和时钟指针速度(内存压力)。

但缓存对象可能无效。由Mitch链接的白皮书详细解释了查询计划失效的各种原因:Plan Caching in SQL Server 2008