症状
如果在同一哈希存储桶中发生了太多并发插入,或者临时 SQL Server 计划缓存达到了其160036的条目限制,则会发生 SOS_CACHESTORE spinlock 严重争用。 在这种情况下,在 Microsoft SQL Server 中会出现高 CPU 使用率。
原因
当 SQL Server 计划缓存达到其入口限制时,就会出现此问题,并且必须收回具有低廉成本的计划才能插入新计划。 这将导致为 SQL Server 计划缓存的哈希表存储桶提供同步的 SOS_CACHESTORE spinlock 的大量争用。
解决方案
累积更新信息
在 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 计划缓存的存储桶数为40009。 因此,SQL Server 计划缓存内可容纳的最大条目数是160036。
如果你有一个使用不同的特殊查询的工作负荷,此限制可能会成为瓶颈。 此修补程序所做的更改可解决这种情况。 安装此修补程序并使用启动跟踪标志 "-T 174" 启用更改后,存储桶计数将增加到64位系统上的160001。 然后,计划缓存可以保持最大的640004计划。
状态
Microsoft 已确认这是在“适用范围”部分中列出的 Microsoft 产品存在的问题。