2010-07-19 86 views
1

我的理解是,SQL Server中的一些DMV依赖于正在缓存的查询计划。我的问题是这些。所有查询计划都缓存了吗?如果不是,什么时候查询计划没有被缓存?对于被缓存的内容,它们停留在缓存中多久?SQL DMV查询和缓存计划

非常感谢

回答

2

一些SQL服务器DMV的直接相关的查询计划缓存捕获令牌,是在放置在查询计划缓存(由于即席查询内存压力的摆布,其他内存用法和高活动,或通过重新编译)。查询计划高速缓存受到计划老化的影响(例如,成本为10的计划被引用5次,其年龄值为50):

如果满足以下条件,计划将从内存:

·由系统

·该计划的“年龄”已经由现有的连接 Ref达到零

·该计划没有被引用的需要更多的内存。

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

影响查询计划缓存的因素,因为SQL Server 2000中已经略有改变为SQL Server 2008上的最新参考这里:Plan Caching in SQL Server 2008

+0

+1只要提到重新编译可以作为插入数据和自动更新统计信息以及DDL语句和显式重新编译的自然结果发生。 – 2010-07-19 13:58:33

+0

谢谢,非常好的答案。你能告诉我一个查询计划如何进入缓存吗?所有查询的计划都被缓存了吗? – 2010-07-19 14:05:06

+0

@Randy:你看到什么问题,促使你问这个问题? – 2010-07-19 14:11:04

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