sys.dm_exec_query_plan_stats (Transact-sql SQL)

適用対象: SQL Server 2019 以降 Azure SQL Database Azure Synapse Analytics Parallel Data Warehouse

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

構文

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 値は許可されます。
暗号 bit 対応するプロシージャが暗号化されているかどうか。

0 = 暗号化されていない

1 = 暗号化されている

NULL 値は許可されません。
query_plan xml Plan_handle で指定された実際のクエリ実行プランの最後に認識されたランタイム Showplan 表現を格納します。 プラン表示は XML 形式です。 アドホック Transact-SQL ステートメント、ストアド プロシージャ コール、ユーザー定義関数コールなどを含むバッチごとに、1 つのプランが生成されます。

NULL 値は許可されます。

解説

これはオプトイン機能です。 サーバーレベルでを有効にするには、 トレースフラグ 2451 を使用します。 データベースレベルでを有効にするには、 ALTER database スコープ構成 (Transact SQL)の 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で確認できます。
    AND
  • 実行されているクエリは複雑であるか、リソースを消費しています。

次の条件下では、返されるテーブルの [ query_plan ] 列に、次のような 単純な 1 プラン表示出力が返され sys.dm_exec_query_plan_stats ます。

  • プランは sys.dm_exec_cached_plansで確認できます。
    AND
  • クエリは単純であり、通常は OLTP ワークロードの一部として分類されます。

1 は、ルートノードの演算子 (SELECT) のみを含む Showplan を参照します。

次の条件下では、からの 出力は返されません sys.dm_exec_query_plan_stats

  • を使用して指定されたクエリプランは、 plan_handle プランキャッシュから削除されています。
    OR
  • 最初の場所では、クエリプランをキャッシュできませんでした。 詳細については、「 実行プランのキャッシュと再利用 」を参照してください。

注意

Xml データ型で許可されている入れ子になったレベルの数に制限があるため、で sys.dm_exec_query_plan は、入れ子になった要素の128レベル以上を満たすクエリプランを返すことはできません。 以前のバージョンのでは SQL Server 、この条件が原因でクエリプランが返されず、 エラー 6335が生成されます。 SQL Server 2005 (9.x)Service Pack 2 以降のバージョンでは、 query_plan 列は NULL を返します。

アクセス許可

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

参照

トレース フラグ
動的管理ビューと動的管理関数 (Transact-SQL)
実行関連の動的管理ビュー (Transact SQL)