症狀
當同一雜湊桶中同時插入過多,或臨時 SQL Server 計畫快取達到 160,036 的入口限制時,SOS_CACHESTORE spinlock 會發生嚴重爭用。 在這種情況下,Microsoft SQL Server 會使用率很高。
原因
問題發生在 SQL Server 計畫快取達到進入限制時,必須將低成本的計畫逐出才能插入新計畫。 這會讓提供 SQL Server 計畫快取雜湊表桶同步的 SOS_CACHESTORE spinlock 產生激烈爭用。
解決方式
累積更新資訊
此問題首次在 SQL Server 的累積更新中得到修正。
- Cumulative Update 1 for SQL Server 2014 SP1
- Cumulative Update 5 for SQL Server 2012 SP2
- 累積更新6 for SQL Server 2014
- Cumulative Update 14 for SQL Server 2012 SP1
關於 SQL Server 的累積更新
每次新的 SQL Server 累積更新都包含了之前累積更新中包含的所有熱修補與安全修補。 請查看 SQL Server 的最新累積更新:
- SQL Server 2014 SP1 的最新累積更新
- SQL Server 2012 SP2 的最新累積更新
- SQL Server 2014 最新累積更新
- SQL Server 2012 SP1 的最新累積更新
計畫快取有兩個限制:總大小與所有計畫的總數量。 以下白皮書說明了規模與參賽數量限制:
計畫快取最多可容納的條目數是桶數的四倍。 您可以透過以下查詢來驗證這些資訊:
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 產品中的問題。