現象
同じハッシュ バケット内で発生する同時挿入が多すぎる場合、またはアドホック SQL Server プラン キャッシュがエントリ制限の 160,036 に達すると、スピンロックで重大SOS_CACHESTORE競合が発生します。 この状況では、Microsoft SQL Server で高い CPU 使用率が発生します。
原因
この問題は、SQL Server プラン キャッシュがエントリ制限に達し、新しいプランを挿入するために低コストのプランを破棄する必要がある場合に発生します。 これにより、SQL Server プラン キャッシュのハッシュ テーブル バケットの同期を提供する SOS_CACHESTORE スピンロックに対して激しい競合が発生します。
解決策
累積的な更新プログラムの情報
この問題は、次の SQL Server の累積的な更新プログラムで最初に修正されました。
- SQL Server 2014 SP1 の累積的な更新プログラム 1
- SQL Server 2012 SP2 の累積的な更新プログラム 5
- SQL Server 2014 の累積的な更新プログラム 6
- SQL Server 2012 SP1 の累積的な更新プログラム 14
SQL Server 用の累積的な更新プログラムについて
SQL Server 用の新しい累積的な更新プログラムには、以前の累積的な更新プログラムに含まれていたすべての修正プログラムとすべてのセキュリティ修正プログラムが含まれています。 SQL Server の最新の累積的な更新プログラムを確認してください。
- SQL Server 2014 SP1 の最新の累積的な更新プログラム
- SQL Server 2012 SP2 の最新の累積的な更新プログラム
- SQL Server 2014 の最新の累積的な更新プログラム
- SQL Server 2012 SP1 の最新の累積的な更新プログラム
プラン キャッシュには 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 のプランを保持できます。
状態
Microsoft は、これが "適用対象" セクションに記載されている Microsoft 製品の問題であることを確認しました。