適用対象: Sql Server 2019 (15.x) 以降のバージョン
Azure SQL Database
Azure SQL Managed Instance
Sql データベース
以前にキャッシュされたクエリ プランの最後の既知の実際の実行プランに相当する値を返します。
構文
sys.dm_exec_query_plan_stats ( plan_handle )
引数
plan_handle
既に実行されてプランがプラン キャッシュに格納されているバッチ、または現在実行中のバッチに関するクエリ実行プランの一意識別子を指定するトークンです。 plan_handle は varbinary(64) です。
次の動的管理オブジェクトから plan_handle を取得できます。
- sys.dm_exec_cached_plans
- sys.dm_exec_query_stats
- sys.dm_exec_requests
- sys.dm_exec_procedure_stats
- sys.dm_exec_trigger_stats
返されるテーブル
| 列名 | データ型 | 説明 |
|---|---|---|
dbid |
smallint | このプランに対応する Transact-SQL ステートメントがコンパイルされたときに有効であったコンテキスト データベースの ID。 アドホックおよび準備済み SQL ステートメントの場合、ステートメントがコンパイルされたデータベースの ID。 列で NULL 値を使用できます。 |
objectid |
int | このクエリ プランのオブジェクト (ストアド プロシージャやユーザー定義関数など) の ID。 アドホック バッチと準備バッチの場合、この列は null です。 列で NULL 値を使用できます。 |
number |
smallint | 番号付きストアド プロシージャの整数。 たとえば、 orders アプリケーションのプロシージャのグループには、 orderproc;1、 orderproc;2などの名前が付けられます。 アドホック バッチと準備バッチの場合、この列は null です。列で NULL 値を使用できます。 |
encrypted |
bit | ストアド プロシージャが暗号化されているかどうかを指定します。 0 = 暗号化なし 1 = 暗号化 列で NULL 値を使用できません。 |
query_plan |
xml |
plan_handle で指定したクエリ実行プランを表す、最後の既知のランタイムのプラン表示。 プラン表示は XML 形式です。 アドホック Transact-SQL ステートメント、ストアド プロシージャ コール、ユーザー定義関数コールなどを含むバッチごとに、1 つのプランが生成されます。 列で NULL 値を使用できます。 |
解説
これはオプトイン機能です。 サーバー レベルで有効にするには、 トレース フラグ 2451 を使用します。 データベース レベルで有効にするには、LAST_QUERY_PLAN_STATS の オプションを使用します。
このシステム関数は、軽量クエリ実行統計プロファイリング インフラストラクチャで動作します。 詳細については、「クエリ プロファイリング インフラストラクチャ」を参照してください。
sys.dm_exec_query_plan_stats で出力されたプラン表示には次の情報が含まれます。
キャッシュされたプランで見つかったすべてのコンパイル時情報
演算子あたりの実際の行数、クエリの CPU 時間と実行時間の合計、スピル警告、実際の DOP、最大使用メモリ、許可されたメモリなどのランタイム情報
次の条件では、実際の実行プランと同等のプラン表示出力が、query_plan の返されるテーブルの sys.dm_exec_query_plan_stats 列に返されます。
プランは sys.dm_exec_cached_plans にあります。
そして
実行中のクエリは複雑であるか、リソースを消費しています。
次の条件では、簡略化された1 プラン表示出力が、query_plan の返されるテーブルの sys.dm_exec_query_plan_stats 列に返されます。
プランは sys.dm_exec_cached_plans にあります。
そして
クエリは単純で、通常は OLTP ワークロードの一部として分類されます。
1 ルート ノード演算子 (SELECT) のみを含むプラン表示を参照します。
次の条件では、 からはsys.dm_exec_query_plan_stats。
plan_handleを使用して指定されたクエリ プランがプラン キャッシュから削除されました。又は
そもそもクエリ プランをキャッシュできませんでした。 詳細については、「プランキャッシュの実行と再利用」をご覧ください。
Note
xml データ型で許可される入れ子になったレベルの数に制限があります。つまり、sys.dm_exec_query_planは、入れ子になった要素のレベルが 128 レベルを満たすクエリ プランを返すことはできません。 SQL Server の以前のバージョンでは、この条件が原因でクエリ プランが返されず、エラー 6335 が生成されます。 SQL Server 2005 (9.x) Service Pack 2 以降のバージョンでは、 query_plan 列は NULLを返します。
アクセス許可
SQL Server 2019 (15.x) 以前のバージョンでは、サーバーに対する VIEW SERVER STATE アクセス許可が必要です。
SQL Server 2022 (16.x) 以降のバージョンでは、サーバーに対する VIEW SERVER PERFORMANCE STATE アクセス許可が必要です。
例
A. 特定のキャッシュされたプランの最後の既知の実際のクエリ実行プランを確認する
次の例では、sys.dm_exec_cached_plans をクエリして目的のプランを検索し、その plan_handle を出力結果からコピーします。
SELECT * FROM sys.dm_exec_cached_plans;
GO
次に、最後の既知の実際のクエリ実行プランを取得するには、コピーした plan_handle をシステム関数 sys.dm_exec_query_plan_stats とともに使用します。
SELECT * FROM sys.dm_exec_query_plan_stats(< copied plan_handle >);
GO
B. キャッシュされたすべてのプランの最後の既知の実際のクエリ実行プランを確認する
SELECT * FROM sys.dm_exec_cached_plans AS cp
CROSS APPLY sys.dm_exec_sql_text(plan_handle) AS st
CROSS APPLY sys.dm_exec_query_plan_stats(plan_handle) AS qps;
GO
C. 特定のキャッシュされたプランとクエリ テキストの最後の既知の実際のクエリ実行プランを確認する
SELECT * FROM sys.dm_exec_cached_plans AS cp
CROSS APPLY sys.dm_exec_sql_text(plan_handle) AS st
CROSS APPLY sys.dm_exec_query_plan_stats(plan_handle) AS qps
WHERE st.text LIKE 'SELECT * FROM Person.Person%';
GO
D. キャッシュされたイベントでトリガーを調べる
SELECT * FROM sys.dm_exec_cached_plans
CROSS APPLY sys.dm_exec_query_plan_stats(plan_handle)
WHERE objtype = 'Trigger';
GO