次の方法で共有


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_handlevarbinary(64) です。

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

返されるテーブル

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

  • 実行中のクエリは複雑であるか、リソースを消費しています。

次の条件では、簡略化された1 プラン表示出力が、sys.dm_exec_query_plan_stats の返されるテーブルの query_plan 列に返されます。

  • プランは sys.dm_exec_cached_plans にあります。

    AND

  • クエリは単純で、通常は 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 を返します。

アクセス許可

サーバーに対する VIEW SERVER STATE 権限が必要です。

SQL Server 2022 以降でのアクセス許可

サーバーに対する 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

関連項目