SQL Serverのクエリのコストを評価するには実行計画を取得する必要がある.最近のバージョンではクエリストアでクエリのコストを視覚化することが可能となった.今回はSQL Serverの実行計画を取得する従来の方法と,クエリストアを表示する方法を紹介する.元にした記事は日平均気温の過去30日間の移動平均をSQL Serverのウィンドウ関数を用いて計算するである.
実行計画を取得する
今回使用するデータベースはHeatStrokeDBである.気象庁の日最高気温や日平均気温をダウンロードしてテーブル化したもの,総務省消防庁の熱中症搬送人員数をダウンロードしてテーブル化したものである.
実際の実行プランを含める
最も手っ取り早い方法はSQL Server Management Studioの「実際の実行プランを含める」ボタンを押下する方法である.

下図のように「結果」「メッセージ」タブの右側に「実行プラン」タブが表示される.

SET STATISTICS PROFILE ON
テキストベースで結果を取得したい場合,クエリの前にSET STATISTICS PROFILE ONを加える.
SET STATISTICS PROFILE ON;
SELECT
D.年月日
, D.都道府県
, AVG(D.日平均気温)
OVER (PARTITION BY D.都道府県
ORDER BY D.年月日 ASC
ROWS BETWEEN 29 PRECEDING AND CURRENT ROW) AS '移動平均30日間'
FROM dbo.T_DailyAvgTemp AS D
ORDER BY 都道府県, 年月日;
SET STATISTICS PROFILE OFF;
結果は要約したものを掲載する.
| PhysicalOp | EstimateIO | EstimateCPU |
|---|---|---|
| NULL | NULL | NULL |
| Parallelism | 0 | 0.6673307 |
| Compute Scalar | 0 | 0.000188588 |
| Compute Scalar | 0 | 0.001885875 |
| Stream Aggregate | 0 | 0.01184329 |
| Window Spool | 0 | 0.04145153 |
| Segment | 0 | 0.00118433 |
| Compute Scalar | 0 | 0.001885875 |
| Sequence Project | 0 | 0.0015087 |
| Segment | 0 | 0.000377175 |
| Stream Aggregate | 0 | 0.01184329 |
| Window Spool | 0 | 0.04145153 |
| Segment | 0 | 0.00118433 |
| Sequence Project | 0 | 0.0015087 |
| Segment | 0 | 0.000377175 |
| Sort | 0.001407658 | 1.489128 |
| Parallelism | 0 | 0.1188947 |
| Table Scan | 0.3957176 | 0.02076425 |
クエリストアを表示する
SQL Server 2022 からデフォルトでオンになった機能がクエリストアである.従来のデータベースの場合,手動でクエリストアをオンにする必要がある.
データベースを右クリックして「プロパティ」
データベースを右クリックして「プロパティ」を選択する.

「クエリストア」の「操作モード(要求)」を「読み取り/書き込み」に
「クエリストア」の「操作モード(要求)」を「読み取り/書き込み」に変更する.

データベースをリフレッシュ
データベースを右クリックしてリフレッシュすると,「クエリストア」ノードが出現している.

リソースを消費するクエリの上位
最も使用するのは上から3番目の「リソースを消費するクエリの上位」だと思われる.

まとめ
SQL Serverのクエリコストを評価するため,従来の「実際の実行プランを含める」「SET STATISTICS PROFILE ON」に加えて新機能のクエリストアを紹介した.

