sys.dm_exec_query_statistics_xml (Transact-SQL)

適用対象: SQL Server 2016 (13.x) 以降 Azure SQL DatabaseAzure SQL Managed Instance

実行中の要求のクエリ実行プランを返します。 この DMV を使用して、一時的な統計を含むプラン表示 XML を取得します。

構文

sys.dm_exec_query_statistics_xml(session_id)  

引数

session_id
検索するバッチを実行しているセッション ID です。session_idsmallint です。 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 許容。

解説

重要

DMV を使用した監視ストアド プロシージャ sys.dm_exec_query_statistics_xml の実行中にランダム アクセス違反 (AV) が発生する可能性がある場合、プラン表示 XML 属性 <ParameterList> 値 ParameterRuntimeValue は SQL Server 2017 (14.x) CU 26 および SQL Server 2019 (15.x) CU 12 で削除されました。 この値は、実行時間の長いストアド プロシージャのトラブルシューティングに役立ちます。

SQL Server 2017 (14.x) CU 31 および SQL Server 2019 (15.x) CU 19 以降では、プラン表示 XML 属性 <ParameterList> 値 ParameterRuntimeValue のコレクションが再び有効になり、トレース フラグ 2446 が含まれるようになりました。 このトレース フラグを使用すると、追加のオーバーヘッドが発生するコストでランタイム パラメーター値を収集できます。

警告

トレース フラグ 2446 は、運用環境で継続的に有効にするためのものではなく、時間を限定したトラブルシューティング目的でのみ使用します。 このトレース フラグを使用すると、sys.dm_exec_query_statistics_xml が呼び出されるかどうかにかかわらず、実行時パラメーター情報を含むプラン表示 XML フラグメントが作成されるため、CPU とメモリのオーバーヘッドが (場合によっては大幅に) 増加します。

Note

SQL Server 2022 (16.x)、 Azure SQL Database、および Azure SQL Managed Instance 以降で、データベース レベルでこの処理を実現する方法については、ALTER DATABASE SCOPED CONFIGURATION (Transact-SQL)の FORCE_SHOWPLAN_RUNTIME_PARAMETER_COLLECTION オプションを参照してください。

このシステム関数は、SQL Server 2016 (13.x) SP1 以降で使用できます。 KB 3190871を参照してください

このシステム関数は、標準クエリ実行統計プロファイル インフラストラクチャと軽量クエリ実行統計プロファイル インフラストラクチャの両方で動作します。 詳細については、「クエリ プロファイリング インフラストラクチャ」を参照してください。

次の条件では、sys.dm_exec_query_statistics_xmlの返されたテーブルのquery_plan列にプラン表示出力は返されません。

  • 指定した 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 では、ざーばー上のVIEW SERVER STATE アクセス許可が必要です。
SQL Database Premium 階層では、データベースで VIEW DATABASE STATE 権限が必要です。 SQL Database の Standard および Basic 階層では、サーバー管理者 または Microsoft Entra 管理者アカウントが必要です。

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

サーバーに対する VIEW SERVER PERFORMANCE STATE アクセス許可が必要です。

A. 実行中のバッチのライブ クエリ プランと実行統計を確認する

次の例では、 sys.dm_exec_requestsをクエリして目的のクエリを検索し、そのsession_idを出力結果からコピーします。

SELECT * FROM sys.dm_exec_requests;  
GO  

次に、ライブ クエリ プランと実行統計を取得するには、コピーした session_idを システム関数 sys.dm_exec_query_statistics_xmlとともに使用します。

--Run this in a different session than the session in which your query is running.
SELECT * FROM sys.dm_exec_query_statistics_xml(< copied session_id >);  
GO  

または、実行中のすべての要求に対して結合されます。

--Run this in a different session than the session in which your query is running.
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 er
	CROSS APPLY sys.dm_exec_query_statistics_xml(session_id) eqs
WHERE er.session_id <> @@spid;
GO

参照

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