我的理解是,SQL Server中的一些DMV依赖于缓存的查询计划。我的问题是这些。是否缓存了所有查询计划?如果没有,什么时候不缓存查询计划?对于缓存的缓存,它们会在缓存中保留多长时间?
非常感谢
发布于 2010-07-19 21:43:46
一些SQL Server DMV捕获与查询计划缓存直接相关的令牌,它们受到施加在查询计划缓存上的内存压力的支配(由于即席查询、其他内存使用和高活动,或通过重新编译)。查询计划缓存会受到计划老化的影响(例如,一个成本为10的计划被引用了5次,其"age“值为50):
如果满足以下条件,计划将从内存中删除:
·系统需要更多内存
·该计划的“年龄”已达到零
·该计划当前未被现有连接Ref引用。
那些与查询计划缓存没有直接关系的DMV会在“一般”内存压力(缓存数据页)或sql server服务重启的情况下被刷新。
自SQL Server2000以来,影响查询计划缓存的因素略有变化。SQL Server2008的最新参考资料在此处:Plan Caching in SQL Server 2008
发布于 2010-07-20 02:02:13
我只想添加一些极客细节:查询计划缓存利用了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链接的白皮书中有非常详细的解释。
https://stackoverflow.com/questions/3281403
复制相似问题