sys.dm_exec_query_plan_stats (Transact-SQL)

適用対象:SQL Server 2019 (15.x) Azure SQL DatabaseAzure SQL Managed Instance

以前にキャッシュされたクエリ プランの最後の既知の実際の実行プランに相当する を返します。

構文

sys.dm_exec_query_plan_stats ( plan_handle )

引数

plan_handle

実行されたバッチとそのプランがプラン キャッシュに存在するか、現在実行中のバッチのクエリ実行プランを一意に識別するトークン。 plan_handlevarbinary(64) です。

次の動的管理オブジェクトから plan_handle を取得できます。

返されるテーブル

列名 データ型 説明
dbid smallint このプランに対応する Transact-SQL ステートメントがコンパイルされたときに有効であったコンテキスト データベースの ID。 アドホック SQL ステートメントおよび準備された SQL ステートメントの場合、ステートメントがコンパイルされたデータベースの ID。

NULL 値は許可されます。
objectid int ストアド プロシージャやユーザー定義関数など、クエリ プランのオブジェクトの ID。 アドホック バッチおよび準備されたバッチの場合、この列の値は NULL です。

NULL 値は許可されます。
number smallint ストアド プロシージャに付けられた番号 (整数)。 たとえば、orders アプリケーションのプロシージャ グループの名前は、orderproc;1orderproc;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

関連項目