症状
在同一哈希桶中发生过多的并发插入,或者临时SQL Server计划缓存达到其入口限制 160,036 时,SOS_CACHESTORE旋转锁会发生严重争用。 在这种情况下,Microsoft SQL Server中会出现高 CPU 使用率。
原因
当SQL Server计划缓存达到其入口限制时,必须逐出成本较低的计划才能插入新计划时,会出现此问题。 这会导致SOS_CACHESTORE旋转锁出现大量争用,该自旋锁为SQL Server计划缓存的哈希表存储桶提供同步。
解决方法
累积更新信息
此问题首先在以下SQL Server累积更新中得到解决。
SQL Server的每个新累积更新都包含以前的累积更新中包含的所有修补程序和所有安全修补程序。 查看SQL Server的最新累积更新:
更多信息
计划缓存有两个限制:总大小和所有计划的总数。 以下白皮书中介绍了大小和入口计数限制:
计划缓存可以保存的最大条目数是存储桶计数的四倍。 可以通过运行以下查询来验证此信息:
select name, type, buckets_count
from sys.dm_os_memory_cache_hash_tables
where name IN ( 'SQL Plans' , 'Object Plans' , 'Bound Trees' )
select name, type, pages_kb, entries_count
from sys.dm_os_memory_cache_counters
where name IN ( 'SQL Plans' , 'Object Plans' , 'Bound Trees' )
例如,在 64 位系统上,SQL Server计划缓存的存储桶数为 40,009。 因此,SQL Server计划缓存中可以容纳的最大条目数为 160,036。
如果工作负荷使用不同的即席查询,此限制可能会成为瓶颈。 此修补程序所做的更改解决了这种情况。 安装此修补程序并使用启动跟踪标志“-T 174”启用更改后,64 位系统上的存储桶计数将增加到 160,001。 然后,计划缓存最多可以容纳 640,004 个计划。
状态
Microsoft 已经确认这是一个列于“适用范围”部分的 Microsoft 产品问题。