過去にプランのキャッシュ/過剰なクエリの再コンパイルに関する問題を調査する必要があったときは、Microsoftホワイトペーパー'SQLServer2008でのキャッシュの計画' プランのキャッシュ、クエリプランの再利用、再コンパイルの原因、再コンパイルの特定、その他の関連トピックについて説明しているので、ぜひお読みください。
そうは言っても、SQL Serverプロファイラー(クライアントツールのインストールの一部としてインストールした場合は、Microsoft SQL Server 2008->パフォーマンスツールの下にあるはずです)は、クエリのコンパイルに直接関連する3つのイベントを公開します。 / P>
- カーソル
- CursorRecompile
- パフォーマンス
- クエリコンパイル用のShowplanXML
- ストアドプロシージャ
- SP:再コンパイル
ストアドプロシージャを使用しているため、 SP:再コンパイル イベント。このイベントは、ストアドプロシージャ、トリガー、またはユーザー定義関数が再コンパイルされるたびに発生します。 TextData列には、ステートメントの再コンパイルを引き起こしたtsqlステートメントのテキストが表示され、EventSubClass列には、再コンパイルの理由を示すコードが表示されます。
SPのEventSubClassコード:SQL2008で再コンパイル
- 1=スキーマが変更されました
- 2=統計が変更されました
- 3=DNRを再コンパイルする
- 4=オプションの設定が変更されました
- 5=一時テーブルが変更されました
- 6=リモート行セットが変更されました
- 7=変更された参照パーマの場合
- 8=クエリ通知環境が変更されました
- 9=MPIビューが変更されました
- 10=カーソルオプションが変更されました
- 11=再コンパイルオプションあり
次の5つのイベントを監視すると、SQL Serverで呼び出されているストアドプロシージャとステートメント、および再コンパイルをトリガーしているものを確認できます。
- ストアドプロシージャ
- SP:開始
- SP:StmtStarting
- SP:再コンパイル
- SP:完了
- パフォーマンス
- 自動統計
また、通常、これらのイベントのすべての列をキャプチャするようにプロファイラートレースを設定します。これらの5つのイベントを使用してトレースをセットアップし、30〜60秒間トレースを実行してから一時停止すると、再コンパイルの原因のスナップショットが得られるはずです。
ノイズが多すぎる場合は、トレースプロパティに列フィルターを追加して、イン/アウトイベントをフィルター処理することができます。たとえば、ほとんどの再コンパイルが1回だけのデータベースで行われている場合は、databaseIDまたはdatabaseName列に列フィルターを設定して、そのデータベースに対して実行されたクエリだけがトレースに含まれるようにします。
次に、クエリが再コンパイルされるパターンを探し始め、Microsoftのホワイトペーパーを使用して、クエリが再コンパイルをトリガーする理由のガイドとして使用します。