対象者:SQL Server 2016 (13.x) およびそれ以降のバージョン
Azure SQL Database
Azure SQL Managed Instance
SQL Database in Microsoft Fabric
実行中の要求のクエリ実行プランを返します。 この DMV を使用して、一時的な統計を含むプラン表示 XML を取得します。
構文
sys.dm_exec_query_statistics_xml(session_id)
引数
session_id
検索するバッチを実行しているセッション ID。 session_id は smallint です。 session_idは次の動的管理オブジェクトから取得できます。
返されるテーブル
| 列名 | データ型 | 説明 |
|---|---|---|
session_id |
smallint | セッションの ID。 NULL 値は許可されません。 |
request_id |
int | 要求の ID。 NULL 値は許可されません。 |
sql_handle |
varbinary(64) | クエリの一部であるバッチまたはストアド プロシージャを一意に識別するトークン。 Null 許容。 |
plan_handle |
varbinary(64) | 現在実行中のバッチのクエリ実行プランを一意に識別するトークン。 Null 許容。 |
query_plan |
xml | 部分的な統計を含む plan_handle で指定されたクエリ実行プランのランタイムプラン表示表現が含まれます。 プラン表示は XML 形式です。 アドホック Transact-SQL ステートメント、ストアド プロシージャ コール、ユーザー定義関数コールなどを含むバッチごとに、1 つのプランが生成されます。 Null 許容。 |
制限事項
sys.dm_exec_query_statistics_xml DMV を使用して監視ストアド プロシージャを実行しているときにランダム アクセス違反 (AV) が発生する可能性があるため、SQL Server 2017 (14.x) CU 26 および SQL Server 2019 (15.x) CU 12 で showplan XML 属性<ParameterList>値ParameterRuntimeValueが削除されました。 この値は、実行時間の長いストアド プロシージャのトラブルシューティングに役立ちます。 この値は、 トレース フラグ 2446 を使用して、SQL Server 2017 (14.x) CU 31、SQL Server 2019 (15.x) CU 19 以降のバージョンで再度有効にすることができます。 このトレース フラグを使用すると、追加のオーバーヘッドが発生するコストでランタイム パラメーター値を収集できます。
注意事項
トレース フラグ 2446 は、運用環境で継続的に有効にすることを意図したものではなく、時間制限付きのトラブルシューティングのみを目的としています。 このトレース フラグを使用すると、 sys.dm_exec_query_statistics_xml DMV が呼び出されるかどうかにかかわらず、ランタイム パラメーター情報を含む Showplan XML フラグメントが作成されるため、CPU とメモリのオーバーヘッドが大きくなる可能性があります。
SQL Server 2022 (16.x)、Azure SQL Database、および Azure SQL Managed Instance では、FORCE_SHOWPLAN_RUNTIME_PARAMETER_COLLECTION の オプションを使用して、データベース レベルで同じ機能を実現できます。
解説
このシステム機能は、SQL Server 2016 (13.x) Service Pack 1 以降で使用できます。 詳細については、 KB 3190871を参照してください。
このシステム関数は、標準クエリ実行統計プロファイル インフラストラクチャと軽量クエリ実行統計プロファイル インフラストラクチャの両方で動作します。 詳細については、「クエリ プロファイリング インフラストラクチャ」を参照してください。
次の条件下では、返されるテーブルのquery_plan列にsys.dm_exec_query_statistics_xmlのShowplan出力は返されません。
- 指定した session_id に対応するクエリ プランが実行されなくなった場合、返されるテーブルの
query_plan列は null になります。 たとえば、この条件は、プラン ハンドルがキャプチャされてから、プラン ハンドルが一緒に使用されるまでに時間の遅延がある場合に発生する可能性があります。sys.dm_exec_query_statistics_xml
xml データ型で許可される入れ子になったレベルの数に制限があるため、sys.dm_exec_query_statistics_xmlは、入れ子になった要素のレベルが 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 権限が必要です。
SQL Database Premium レベルのデータベースの VIEW DATABASE STATE アクセス許可が必要です。
SQL Database Standard レベルと Basic レベルでは、 サーバー管理者 または Microsoft Entra 管理者 アカウントが必要です。
例
A. 実行中のバッチのライブ クエリ プランと実行統計を確認する
次の例では、sys.dm_exec_requests をクエリして目的のクエリを検索し、その session_id を出力結果からコピーします。
SELECT *
FROM sys.dm_exec_requests;
GO
次に、ライブ クエリ プランと実行統計を取得するには、コピーした session_id をシステム関数 sys.dm_exec_query_statistics_xmlと共に使用します。 このクエリは、クエリが実行されているセッションとは異なるセッションで実行します。
SELECT * FROM sys.dm_exec_query_statistics_xml(< copied session_id >);
GO
または、実行中のすべての要求に対して結合されます。 このクエリは、クエリが実行されているセッションとは異なるセッションで実行します。
SELECT eqs.query_plan,
er.session_id,
er.request_id,
er.database_id,
er.start_time,
er.[status],
er.wait_type,
er.wait_resource,
er.last_wait_type,
(er.cpu_time / 1000) AS cpu_time_sec,
(er.total_elapsed_time / 1000) / 60 AS elapsed_time_minutes,
(er.logical_reads * 8) / 1024 AS logical_reads_KB,
er.granted_query_memory,
er.dop,
er.row_count,
er.query_hash,
er.query_plan_hash
FROM sys.dm_exec_requests AS er
CROSS APPLY sys.dm_exec_query_statistics_xml(session_id) AS eqs
WHERE er.session_id <> @@SPID;
GO