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 で指定されたクエリ実行プランのランタイム Showplan 表現が含まれます。 プラン表示は XML 形式です。 アドホック Transact-SQL ステートメント、ストアド プロシージャ コール、ユーザー定義関数コールなどを含むバッチごとに、1 つのプランが生成されます。 NULL 値は許可されます。

解説

重要

DMV を使用した監視ストアド プロシージャsys.dm_exec_query_statistics_xmlの実行中にランダム アクセス違反 (AV) が発生する可能性がある場合、Showplan 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 以降では、Showplan XML 属性 <ParameterList> 値ParameterRuntimeValueのコレクションが再び有効になり、トレース フラグ 2446 が含まれるようになりました。 このトレース フラグを使用すると、追加のオーバーヘッドが発生するコストでランタイム パラメーター値を収集できます。

警告

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

注意

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 レベルでは、サーバー管理者または Azure Active Directory 管理者アカウントが必要です。

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)