Microsoft は、Microsoft SQL Server 2008 R2 の修正プログラムを1つのダウンロード可能なファイルとして配布します。 修正プログラムは累積的であるため、新しいリリースごとに、以前の SQL Server 2008 R2 fix release に含まれていたすべての修正プログラムとセキュリティの修正プログラムが含まれています。
現象
次のような状況で問題が発生します。
-
アプリケーションは、Microsoft SQL Server 2008 および Microsoft SQL Server 2008 R2 の一部の一時テーブルを参照するクエリを実行します。 一時テーブルは、ストアドプロシージャではなくセッションで作成されます。
-
クエリプランがキャッシュされます。
-
多くのユーザーは、同時実行環境で同じクエリを実行します。たとえば、多くのユーザーは、次のクエリを実行するアプリケーションを使用します。
create table #x (col1 int) go insert into #x values (1) go select * from #x where col1 = 1 go
このシナリオでは、アプリケーションでパフォーマンスの問題が発生します。注: この問題を特定する方法の詳細については、「詳細情報」セクションを参照してください。
原因
この問題が発生するのは、クエリテキストが同じである場合に、同じハッシュバケットで同じクエリプランがキャッシュに挿入されるためです。多数のプランが同じバケット (ハッシュチェーンとも呼ばれます) にハッシュされる場合、キャッシュ内のプランを検索する時間が大幅に増加し、パフォーマンスの問題が発生する可能性があります。 さらに、ワーカースレッドは重大なスピンロックの競合を発生する可能性があります。また、これらのワーカースレッドが適切なスケジューラの生成を実行しない場合は、他のスレッドが影響を受けます。
解決方法
注: 現在、SQL Server 2008 R2 の更新プログラムのみが提供されています。 SQL Server 2008 の場合、この問題を回避するには、「回避策」セクションを参照してください。
累積的な更新プログラムの情報
SQL Server 2008 R2 Service Pack 1
この問題の修正プログラムは、SQL Server 2008 R2 Service Pack 1 の累積更新プログラム1で最初にリリースされました。この累積的な更新プログラムパッケージの入手方法の詳細については、次の記事番号をクリックして、Microsoft サポート技術情報の記事を参照してください。
2544793 SQL Server 2008 R2 Service Pack 1 の累積的な更新プログラムパッケージ1注: ビルドは累積的であるため、各新しい修正プログラムには、以前の SQL Server 2008 R2 fix release に含まれていたすべての修正プログラムとセキュリティ修正プログラムが含まれています。 この修正プログラムを含む最新の修正プログラムを適用することを検討することをお勧めします。 詳細については、次のマイクロソフト サポート技術情報番号をクリックしてください。
2567616 SQL Server 2008 R2 Service Pack 1 がリリースされた後にリリースされた SQL Server 2008 R2 ビルド
SQL Server 2008 R2
この問題の修正プログラムは、累積的な更新プログラム7で最初にリリースされました。SQL Server 2008 R2 用の累積的な更新プログラムパッケージの入手方法の詳細については、次の記事番号をクリックして、Microsoft サポート技術情報の記事を参照してください。
2507770 SQL Server 2008 R2 の累積更新プログラムパッケージ7 注: ビルドは累積的であるため、各新しい修正プログラムには、以前の SQL Server 2008 R2 fix release に含まれていたすべての修正プログラムとセキュリティ修正プログラムが含まれています。 この修正プログラムを含む最新の修正プログラムを適用することを検討することをお勧めします。 詳細については、次のマイクロソフト サポート技術情報番号をクリックしてください。
981356 SQL Server 2008 R2 のリリース後にリリースされた SQL Server 2008 R2 ビルド
状態
マイクロソフトでは、この問題をこの資料の対象製品として記載されているマイクロソフト製品の問題として認識しています。
回避策
SQL Server 2008 および SQL Server 2008 R2 でこの問題を回避するには、一時テーブルの参照をストアドプロシージャ内に移動します。
詳細情報
表の基本を作成および変更する方法の詳細については、次の MSDN web サイトを参照してください。
テーブルの基礎を作成および変更する方法スピンロックの競合は、 SOS_CACHESTOREスピンロックに高い競合率を持つsys.dm_os_spinlock_stats動的管理ビュー (DMV) から識別できます。この問題を特定するには、次のようなクエリを実行します。
select cp.bucketid, count(cp.bucketid) as BucketCount, st.text from sys.dm_exec_cached_plans cp cross apply sys.dm_exec_sql_text(cp.plan_handle) as st group by cp.bucketid, st.text having count(cp.bucketid) >1 order by BucketCount descこのクエリを実行したときに次の条件が当てはまる場合は、パフォーマンスの問題が発生する可能性があります。
-
このクエリでは、同じクエリテキストが生成されます。
-
同じ bucketid の数が大きすぎます。注: 通常、同じ bucketid に対して大きいカウントは、1000を超えています。
-
クエリは一時テーブルを参照します。