現象
同じハッシュバケット内で同時に挿入が多すぎる場合、またはアドホックの SQL Server プランキャッシュがそのエントリの上限である160036の場合、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 プランキャッシュのバケット数は40009です。 したがって、SQL Server プランキャッシュ内に収めることができるエントリの最大数は160036です。
複数のアドホッククエリを使用するワークロードを使用している場合は、この制限がボトルネックになることがあります。 この修正プログラムによって行われる変更は、この状況に対応しています。 この修正プログラムをインストールして、スタートアップトレースフラグ "-T 174" を使用して変更を有効にした後、バケット数は64ビットシステムの160001に増加します。 これにより、プランキャッシュで最大640004プランを保持することができます。
状態
マイクロソフトでは、この問題をこの資料の対象製品として記載されているマイクロソフト製品の問題として認識しています。