現象
同じハッシュ バケットで同時挿入が多すぎる場合、またはアドホック SQL Server プラン キャッシュのエントリ制限が 160,036 に達すると、SOS_CACHESTOREスピンロックで重大な競合が発生します。 このような状況では、Microsoft SQL Serverで CPU 使用率が高くなります。
原因
この問題は、SQL Server プラン キャッシュがエントリ制限に達したときに発生し、新しいプランを挿入するために低コストのプランを削除する必要があります。 これにより、SQL Server プラン キャッシュのハッシュ テーブル バケットの同期を提供するSOS_CACHESTOREスピンロックの競合が発生します。
解決方法
累積的な更新情報
この問題は、SQL Serverの次の累積的な更新プログラムで最初に修正されました。
SQL Serverの各新しい累積的な更新プログラムには、すべての修正プログラムと、以前の累積的な更新プログラムに含まれていたすべてのセキュリティ修正プログラムが含まれています。 SQL Serverの最新の累積的な更新プログラムを確認してください。
詳細情報
プラン キャッシュには、合計サイズとすべてのプランの合計数という 2 つの制限があります。 サイズとエントリ数の制限については、次のホワイト ペーパーで説明します。
プラン キャッシュが保持できるエントリの最大数は、バケット数の 4 倍です。 この情報を確認するには、次のクエリを実行します。
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 個のプランを保持できます。
状態
マイクロソフトでは、この問題をこの資料の対象製品として記載されているマイクロソフト製品の問題として認識しています。