sys.dm_exec_query_plan_stats (Transact-SQL)
適用対象:SQL Server 2019 (15.x)
Azure SQL Database
Azure SQL Managed Instance
以前にキャッシュされたクエリ プランの最後の既知の実際の実行プランに相当する を返します。
構文
sys.dm_exec_query_plan_stats ( plan_handle )
引数
plan_handle
実行されたバッチとそのプランがプラン キャッシュに存在するか、現在実行中のバッチのクエリ実行プランを一意に識別するトークン。 plan_handle は varbinary(64) です。
次の動的管理オブジェクトから plan_handle を取得できます。
- sys.dm_exec_cached_plans (Transact-SQL)
- sys.dm_exec_query_stats (Transact-SQL)
- sys.dm_exec_requests (Transact-SQL)
- sys.dm_exec_procedure_stats (Transact-SQL)
- sys.dm_exec_trigger_stats (Transact-SQL)
返されるテーブル
列名 | データ型 | 説明 |
---|---|---|
dbid | smallint | このプランに対応する Transact-SQL ステートメントがコンパイルされたときに有効であったコンテキスト データベースの ID。 アドホック SQL ステートメントおよび準備された 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 を使用します。 データベース レベルで有効にするには、 ALTER DATABASE SCOPED CONFIGURATION (Transact-SQL) の LAST_QUERY_PLAN_STATS オプションを使用します。
このシステム関数は、 軽量 のクエリ実行統計プロファイル インフラストラクチャで動作します。 詳細については、「クエリ プロファイリング インフラストラクチャ」を参照してください。
[プラン表示] 出力には sys.dm_exec_query_plan_stats
、次の情報が含まれます。
- キャッシュされたプランで見つかったすべてのコンパイル時情報
- 演算子あたりの実際の行数、クエリの CPU 時間と実行時間の合計、スピル警告、実際の DOP、使用される最大メモリ、許可されたメモリなどのランタイム情報
次の条件では、 の返されたテーブルsys.dm_exec_query_plan_stats
の列に、実際の実行プランとquery_plan
同等のプラン表示出力が返されます。
プランは sys.dm_exec_cached_plans にあります。
AND
実行されているクエリが複雑であるか、リソースを消費しています。
次の条件では、 の返されたテーブルsys.dm_exec_query_plan_stats
の列にquery_plan
、簡略化された1 プラン表示出力が返されます。
プランは sys.dm_exec_cached_plans にあります。
AND
クエリは十分に単純であり、通常は OLTP ワークロードの一部として分類されます。
1 ルート ノード演算子 (SELECT) のみを含むプラン表示を参照します。
次の条件では、 からsys.dm_exec_query_plan_stats
出力は返されません。
を使用
plan_handle
して指定されたクエリ プランは、プラン キャッシュから削除されています。OR
クエリ プランは、最初はキャッシュできませんでした。 詳細については、「 実行プランのキャッシュと再利用」を参照してください。
注意
xml データ型で許可される入れ子になったレベルの数の制限は、入れ子になった要素の 128 レベルを満たすか、または超えるクエリ プランを返すことができないことをsys.dm_exec_query_plan
意味します。 以前のバージョンのSQL Serverでは、この条件によってクエリ プランが返されるのを防ぎ、エラー 6335 が生成されました。 SQL Server 2005 (9.x) Service Pack 2 以降のバージョンでは、列は query_plan
NULL を返します。
アクセス許可
サーバーに対する VIEW SERVER STATE
権限が必要です。
SQL Server 2022 以降のアクセス許可
サーバーに対する VIEW SERVER PERFORMANCE STATE 権限が必要です。
例
A. 特定のキャッシュされたプランの最後の既知の実際のクエリ実行プランを確認する
次の例では、興味深いプランを検索し、そのプランをplan_handle
出力からコピーするためにクエリsys.dm_exec_cached_plans
を実行します。
SELECT * FROM sys.dm_exec_cached_plans;
GO
次に、最後の既知の実際のクエリ実行プランを取得するには、システム関数 sys.dm_exec_query_plan_stats
でコピーした plan_handle
を使用します。
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