昨日、SQL Server Management Studio (SSMS) でクエリを実行する際に、実行プランを表示してクエリのコストを確認することができます。
この時のコストの見方について少しまとめてみたいと思います。
クエリのコストについては以下の情報が参考になるかと。
How To 情報: SQL クエリを最適化する方法
SET SHOWPLAN_ALL (Transact-SQL)
プラン表示の論理操作と物理操作のリファレンス
■バッチとステートメント
SSMS でコストを確認する際、バッチの相対コストとステートメントの絶対コストを確認する必要があります。
- ステートメント = 単一のクエリ
- バッチ = ステートメントの集合
になるでしょうか。
SSMS でクエリのコストを確認する場合、ステートメントなのかバッチなのかを意識する必要があるかと思います。
プロファイラのイベントでも BatchCompleted と StmtCompleted が分かれていますね。
というようなクエリを実行した場合、バッチとしてとらえると 2 つの SELECT 文をまとめたものが該当します。
ステートメントは個々の SQL ですね。
先程のクエリをプロファイラで取得した場合は以下のようになります。
StmtCompleted では個々の SQL / BatchCompleted では二つのクエリが表示されていますね。
■SSMS でクエリのコストを取得
SSMS でクエリのコストを取得すると以下のような情報が取得できます。
コストとしてバッチ相対とクエリ内の絶対コストがあります。
バッチ相対は複数のクエリを相対比較したものになります。
これは TotalSubtreeCost としてあらわされるものになり、BOL には以下のように記載されています。
コスト単位は、ウォール クロック時間ではなく、内部測定時間に基づいています。コスト単位は、プランの相対コストを他のプランと比較して決定するために使用されます。
ひとつのクエリエディタ内で複数のクエリを実行する場合はバッチ相対の % 表示を利用して、相対的にどのクエリのコストが高いかを確認することができます。
内部測定時間に基づいての比較となっているようなので、実際の実行時間で見た場合はコストが低くても時間がかかることがあると思いますが、一連の処理の中でどこを重点的に改善すればよいかの判断を使用するにはバッチ相対のコストを参考にするとよいかと思います。
どのクエリを改善するかの目安がついたらそのクエリ内のどの箇所を改善すればよいかを判断する必要があります。
ここでの判断に使用するのが各アイコンのコストの % になります。
各アイコンのコストはステートメント内のコストになりますのでどこを重点的に改善すればよいかを判断することができます。
各アイコンでは I/O コストと CPU コストが分かりますので、CPU を使用しているのかデータ取得のための I/O が高いのかを確認することができます。
[SET SHOWPLAN_ALL ON] をすることでグリッドにプランを表示できますのでこれでコストを確認しても良いかもしれないですね。
キャッシュされたクエリは sys.dm_exec_query_stats から確認することができますので、ここで worker_time / physical_read / logical_read が高いクエリを確認して、plan_handle からキャッシュされているプランを表示し、どこを改善すればよいかを検討していくのが実行されているサーバーでクエリ改善を行うための一般的な手法になるかとおもいます。
自分なりにクエリ解析の手法が確立できていればこの辺は手間取らずにできると思うのですが、私はクエリ系のスキルは低いのでいつもどうだったかな~と思い返しながら調べていたり…。
もっと勉強しないと駄目ですね。
Management Studio で実行プランを確認した際のコストについて ≪ SE の雑記…
素敵なエントリーの登録ありがとうございます – .NET Clipsからのトラックバック…
.NET Clips
9 7月 12 at 09:46
[…] Management Studio で実行プランを確認した際のコストについて […]
SQL Server | 実行プランの確認方法 | ムラヒロ
4 1月 19 at 10:47