KB3026083 - 修正:SOS_CACHESTORE臨時 SQL Server 計畫快取的 spinlock 爭用會導致 SQL Server CPU 使用率過高

套用到
SQL Server 2012 Developer SQL Server 2012 Enterprise SQL Server 2012 Standard SQL Server 2014 Enterprise - duplicate (do not use) SQL Server 2014 Developer - duplicate (do not use) SQL Server 2014 Standard - duplicate (do not use) SQL Server 2014 Web - duplicate (do not use) SQL Server 2016 Developer - duplicate (do not use) SQL Server 2016 Enterprise - duplicate (do not use) SQL Server 2016 Enterprise Core - duplicate (do not use) SQL Server 2016 Standard - duplicate (do not use) SQL Server 2017 Developer SQL Server 2017 Enterprise SQL Server 2017 Enterprise Core

症狀

當同一雜湊桶中同時插入過多,或臨時 SQL Server 計畫快取達到 160,036 的入口限制時,SOS_CACHESTORE spinlock 會發生嚴重爭用。 在這種情況下,Microsoft SQL Server 會使用率很高。

原因

問題發生在 SQL Server 計畫快取達到進入限制時,必須將低成本的計畫逐出才能插入新計畫。 這會讓提供 SQL Server 計畫快取雜湊表桶同步的 SOS_CACHESTORE spinlock 產生激烈爭用。

解決方式

累積更新資訊

此問題首次在 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 產品中的問題。