sys.dm_exec_query_stats (Transact-SQL)
適用対象: SQL Server Azure SQL Database Azure SQL Managed Instance
SQL Server でキャッシュされたクエリ プランの集計パフォーマンス統計を返します。 このビューには、キャッシュされたプラン内のクエリ ステートメントごとに 1 行が含まれており、その行の有効期間はプラン自体に関連付けられています。 つまり、プランがキャッシュから削除されると、対応する行もこのビューから削除されます。
Note
- データは完了したクエリのみを反映し、まだ実行中のクエリは反映されないため、 sys.dm_exec_query_stats の結果は実行ごとに異なる場合があります。
- これを Azure Synapse Analytics または Analytics Platform System (PDW) の専用 SQL プールから呼び出すには、 sys.dm_pdw_nodes_exec_query_statsという名前を使用します。 サーバーレス SQL プールの場合は、 sys.dm_exec_query_statsを使用します。
列名 | データ型 | 説明 |
---|---|---|
sql_handle | varbinary(64) | クエリが含まれているバッチまたはストアド プロシージャを一意に識別するトークンを指定します。 sql_handle、 statement_start_offset 、 statement_end_offsetと共に、 sys.dm_exec_sql_text 動的管理機能を呼び出すことで、クエリの SQL テキストを取得できます。 |
statement_start_offset | int | バッチまたは保存されるオブジェクトのテキスト内での、行が示すクエリの開始位置 (バイト単位)。0 で始まります。 |
statement_end_offset | int | バッチまたは保存されるオブジェクトのテキスト内での、行が示すクエリの終了位置 (バイト単位)。0 で始まります。 SQL Server 2014 (12.x) より前のバージョンの場合、値 -1 はバッチの終了を示します。 末尾のコメントは削除されました。 |
plan_generation_num | bigint | 再コンパイル後、プランのインスタンスを区別するために使用できるシーケンス番号。 |
plan_handle | varbinary(64) | 既に実行されてプランがプラン キャッシュに格納されているバッチ、または現在実行中のバッチに関するクエリ実行プランの一意識別子を指定するトークンです。 この値を sys.dm_exec_query_plan 動的管理機能に渡して、クエリ プランを取得できます。 ネイティブ コンパイル ストアド プロシージャがメモリ最適化テーブルに対してクエリを実行するときは、常に 0x000 になります。 |
creation_time | datetime | プランがコンパイルされた時刻。 |
last_execution_time | datetime | 前回プランの実行が開始された時刻。 |
execution_count | bigint | 前回のコンパイル時以降に、プランが実行された回数。 |
total_worker_time | bigint | コンパイル後にプランの実行で使用された CPU 時間の合計 (マイクロ秒単位)。ただし、精度はミリ秒単位までです。 ネイティブ コンパイル ストアド プロシージャに関して、多くの実行が 1 ミリ秒未満である場合は、 total_worker_time は精度が高くない可能性があります。 |
last_worker_time | bigint | プランを前回実行したときに使用された CPU 時間 (マイクロ秒単位)。ただし、精度はミリ秒単位までです。 1 |
min_worker_time | bigint | プランの 1 回の実行で使用された最小 CPU 時間 (マイクロ秒単位)。ただし、精度はミリ秒単位までです。 1 |
max_worker_time | bigint | プランの 1 回の実行で使用された最大 CPU 時間 (マイクロ秒単位)。ただし、精度はミリ秒単位までです。 1 |
total_physical_reads | bigint | コンパイル後にこのプランの実行で行われた物理読み取りの合計数。 メモリ最適化テーブルのクエリは常に 0 になります。 |
last_physical_reads | bigint | プランを前回実行したときに行われた物理読み取りの数。 メモリ最適化テーブルのクエリは常に 0 になります。 |
min_physical_reads | bigint | プランの 1 回の実行で行われた物理読み取りの最小数。 メモリ最適化テーブルのクエリは常に 0 になります。 |
max_physical_reads | bigint | プランの 1 回の実行で行われた物理読み取りの最大数。 メモリ最適化テーブルのクエリは常に 0 になります。 |
total_logical_writes | bigint | コンパイル後にプランの実行で行われた論理書き込みの合計数。 メモリ最適化テーブルのクエリは常に 0 になります。 |
last_logical_writes | bigint | プランの最後に完了した実行中に汚れたバッファー プール ページの数。 ページが読み取られた後、ページは最初に変更されたときにのみダーティになります。 ページがダーティになると、この数がインクリメントされます。 既にダーティ ページの後続の変更は、この数には影響しません。 メモリ最適化テーブルに対してクエリを実行する場合、この数値は常に 0 になります。 |
min_logical_writes | bigint | プランの 1 回の実行で行われた論理書き込みの最小数。 メモリ最適化テーブルのクエリは常に 0 になります。 |
max_logical_writes | bigint | プランの 1 回の実行で行われた論理書き込みの最大数。 メモリ最適化テーブルのクエリは常に 0 になります。 |
total_logical_reads | bigint | コンパイル後にこのプランの実行で行われた論理読み取りの合計数。 メモリ最適化テーブルのクエリは常に 0 になります。 |
last_logical_reads | bigint | プランを前回実行したときに行われた論理読み取りの数。 メモリ最適化テーブルのクエリは常に 0 になります。 |
min_logical_reads | bigint | プランの 1 回の実行で行われた論理読み取りの最小数。 メモリ最適化テーブルのクエリは常に 0 になります。 |
max_logical_reads | bigint | プランの 1 回の実行で行われた論理読み取りの最大数。 メモリ最適化テーブルのクエリは常に 0 になります。 |
total_clr_time | bigint | コンパイル後、このプランの実行によって Microsoft .NET Framework 共通言語ランタイム (CLR) オブジェクト内で消費されるマイクロ秒単位 (ただし、正確からミリ秒のみ) で報告される時間。 CLR オブジェクトには、ストアド プロシージャ、関数、トリガー、型、および集計を指定できます。 |
last_clr_time | bigint | このプランの最後の実行中に .NET Framework CLR オブジェクト内の実行によって消費されるマイクロ秒単位 (ただし、正確からミリ秒のみ) で報告される時間。 CLR オブジェクトには、ストアド プロシージャ、関数、トリガー、型、および集計を指定できます。 |
min_clr_time | bigint | このプランが 1 回の実行中に .NET Framework CLR オブジェクト内で使用されたことがマイクロ秒単位で報告される最小時間 (ただし、精度はミリ秒のみ)。 CLR オブジェクトには、ストアド プロシージャ、関数、トリガー、型、および集計を指定できます。 |
max_clr_time | bigint | このプランが 1 回の実行中に .NET Framework CLR 内で消費されたことがマイクロ秒単位で報告される最大時間 (ただし、精度はミリ秒のみ)。 CLR オブジェクトには、ストアド プロシージャ、関数、トリガー、型、および集計を指定できます。 |
total_elapsed_time | bigint | このプランの実行完了までの経過時間の合計 (マイクロ秒単位)。ただし、精度はミリ秒単位までです。 |
last_elapsed_time | bigint | このプランの前回の実行完了までの経過時間 (マイクロ秒単位)。ただし、精度はミリ秒単位までです。 |
min_elapsed_time | bigint | 任意のプランの実行完了までの最小経過時間 (マイクロ秒単位)。ただし、精度はミリ秒単位までです。 |
max_elapsed_time | bigint | 任意のプランの実行完了までの最大経過時間 (マイクロ秒単位)。ただし、精度はミリ秒単位までです。 |
query_hash | Binary(8) | クエリで計算され、同様のロジックを持つクエリを識別するために使用される、バイナリのハッシュ値です。 クエリ ハッシュを使用して、リテラル値だけが異なるクエリの全体的なリソース使用率を決定できます。 |
query_plan_hash | binary(8) | クエリ実行プランで計算され、同様のクエリ実行プランを識別するために使用される、バイナリのハッシュ値です。 クエリ プラン ハッシュを使用して、同様の実行プランを持つクエリの累積コストを確認できます。 ネイティブ コンパイル ストアド プロシージャがメモリ最適化テーブルに対してクエリを実行するときは、常に 0x000 になります。 |
total_rows | bigint | クエリによって返される行の合計数。 null にすることはできません。 ネイティブ コンパイル ストアド プロシージャがメモリ最適化テーブルに対してクエリを実行するときは、常に 0 になります。 |
last_rows | bigint | クエリの前回の実行で返された行数。 null にすることはできません。 ネイティブ コンパイル ストアド プロシージャがメモリ最適化テーブルに対してクエリを実行するときは、常に 0 になります。 |
min_rows | bigint | 1 回の実行中にクエリによって返される行の最小数。 null にすることはできません。 ネイティブ コンパイル ストアド プロシージャがメモリ最適化テーブルに対してクエリを実行するときは、常に 0 になります。 |
max_rows | bigint | 1 回の実行中にクエリによって返された行の最大数。 null にすることはできません。 ネイティブ コンパイル ストアド プロシージャがメモリ最適化テーブルに対してクエリを実行するときは、常に 0 になります。 |
statement_sql_handle | varbinary(64) | 適用対象: SQL Server 2014 (12.x) 以降。 クエリ ストアが有効で、その特定のクエリの統計を収集する場合にのみ、NULL 以外の値が設定されます。 |
statement_context_id | bigint | 適用対象: SQL Server 2014 (12.x) 以降。 クエリ ストアが有効で、その特定のクエリの統計を収集する場合にのみ、NULL 以外の値が設定されます。 |
total_dop | bigint | このプランがコンパイルされてから使用された並列処理の次数の合計。 メモリ最適化テーブルに対してクエリを実行する場合、常に 0 になります。 適用対象: SQL Server 2016 (13.x) 以降。 |
last_dop | bigint | このプランが前回実行されたときの並列処理の次数。 メモリ最適化テーブルに対してクエリを実行する場合、常に 0 になります。 適用対象: SQL Server 2016 (13.x) 以降。 |
min_dop | bigint | このプランが 1 回の実行中に使用した並列処理の最小レベル。 メモリ最適化テーブルに対してクエリを実行する場合、常に 0 になります。 適用対象: SQL Server 2016 (13.x) 以降。 |
max_dop | bigint | このプランが 1 回の実行中に使用した並列処理の最大レベル。 メモリ最適化テーブルに対してクエリを実行する場合、常に 0 になります。 適用対象: SQL Server 2016 (13.x) 以降。 |
total_grant_kb | bigint | このプランがコンパイルされてから受け取った予約メモリ許可の合計量 (KB 単位)。 メモリ最適化テーブルに対してクエリを実行する場合、常に 0 になります。 適用対象: SQL Server 2016 (13.x) 以降。 |
last_grant_kb | bigint | このプランが前回実行されたときの予約済みメモリ許可の量 (KB 単位)。 メモリ最適化テーブルに対してクエリを実行する場合、常に 0 になります。 適用対象: SQL Server 2016 (13.x) 以降。 |
min_grant_kb | bigint | このプランが 1 回の実行中に受け取った予約済みメモリ許可の最小量 (KB 単位)。 メモリ最適化テーブルに対してクエリを実行する場合、常に 0 になります。 適用対象: SQL Server 2016 (13.x) 以降。 |
max_grant_kb | bigint | このプランが 1 回の実行中に受信した予約済みメモリ許可の最大量 (KB 単位)。 メモリ最適化テーブルに対してクエリを実行する場合、常に 0 になります。 適用対象: SQL Server 2016 (13.x) 以降。 |
total_used_grant_kb | bigint | このプランがコンパイルされてから使用された予約済みメモリ許可の合計量 (KB 単位)。 メモリ最適化テーブルに対してクエリを実行する場合、常に 0 になります。 適用対象: SQL Server 2016 (13.x) 以降。 |
last_used_grant_kb | bigint | このプランが前回実行されたときに使用されたメモリ許可の量 (KB 単位)。 メモリ最適化テーブルに対してクエリを実行する場合、常に 0 になります。 適用対象: SQL Server 2016 (13.x) 以降。 |
min_used_grant_kb | bigint | このプランが 1 回の実行中に使用したメモリ許可の最小量 (KB 単位)。 メモリ最適化テーブルに対してクエリを実行する場合、常に 0 になります。 適用対象: SQL Server 2016 (13.x) 以降。 |
max_used_grant_kb | bigint | このプランが 1 回の実行中に使用したメモリ許可の最大量 (KB 単位)。 メモリ最適化テーブルに対してクエリを実行する場合、常に 0 になります。 適用対象: SQL Server 2016 (13.x) 以降。 |
total_ideal_grant_kb | bigint | このプランがコンパイルされてから推定された理想的なメモリ許可の合計量 (KB 単位)。 メモリ最適化テーブルに対してクエリを実行する場合、常に 0 になります。 適用対象: SQL Server 2016 (13.x) 以降。 |
last_ideal_grant_kb | bigint | このプランが前回実行されたときの理想的なメモリ許可の量 (KB 単位)。 メモリ最適化テーブルに対してクエリを実行する場合、常に 0 になります。 適用対象: SQL Server 2016 (13.x) 以降。 |
min_ideal_grant_kb | bigint | このプランが 1 回の実行中に推定した理想的なメモリ許可の最小量 (KB 単位)。 メモリ最適化テーブルに対してクエリを実行する場合、常に 0 になります。 適用対象: SQL Server 2016 (13.x) 以降。 |
max_ideal_grant_kb | bigint | このプランが 1 回の実行中に推定した理想的なメモリ許可の最大量 (KB 単位)。 メモリ最適化テーブルに対してクエリを実行する場合、常に 0 になります。 適用対象: SQL Server 2016 (13.x) 以降。 |
total_reserved_threads | bigint | このプランがコンパイルされてから使用された予約済み並列スレッドの合計。 メモリ最適化テーブルに対してクエリを実行する場合、常に 0 になります。 適用対象: SQL Server 2016 (13.x) 以降。 |
last_reserved_threads | bigint | このプランが前回実行されたときの予約済み並列スレッドの数。 メモリ最適化テーブルに対してクエリを実行する場合、常に 0 になります。 適用対象: SQL Server 2016 (13.x) 以降。 |
min_reserved_threads | bigint | このプランが 1 回の実行中に使用した予約済み並列スレッドの最小数。 メモリ最適化テーブルに対してクエリを実行する場合、常に 0 になります。 適用対象: SQL Server 2016 (13.x) 以降。 |
max_reserved_threads | bigint | このプランが 1 回の実行中に使用した予約済み並列スレッドの最大数。 メモリ最適化テーブルに対してクエリを実行する場合、常に 0 になります。 適用対象: SQL Server 2016 (13.x) 以降。 |
total_used_threads | bigint | このプランがコンパイルされてから使用された並列スレッドの合計。 メモリ最適化テーブルに対してクエリを実行する場合、常に 0 になります。 適用対象: SQL Server 2016 (13.x) 以降。 |
last_used_threads | bigint | このプランが最後に実行されたときに使用された並列スレッドの数。 メモリ最適化テーブルに対してクエリを実行する場合、常に 0 になります。 適用対象: SQL Server 2016 (13.x) 以降。 |
min_used_threads | bigint | このプランが 1 回の実行中に使用した並列スレッドの最小数。 メモリ最適化テーブルに対してクエリを実行する場合、常に 0 になります。 適用対象: SQL Server 2016 (13.x) 以降。 |
max_used_threads | bigint | このプランが 1 回の実行中に使用した並列スレッドの最大数。 メモリ最適化テーブルに対してクエリを実行する場合、常に 0 になります。 適用対象: SQL Server 2016 (13.x) 以降。 |
total_columnstore_segment_reads | bigint | クエリによって読み取られた列ストア セグメントの合計。 null にすることはできません。 適用対象: SQL Server 2016 (13.x) SP2 および SQL Server 2017 (14.x) CU3 以降 |
last_columnstore_segment_reads | bigint | クエリの最後の実行によって読み取られた列ストア セグメントの数。 null にすることはできません。 適用対象: SQL Server 2016 (13.x) SP2 および SQL Server 2017 (14.x) CU3 以降 |
min_columnstore_segment_reads | bigint | 1 回の実行中にクエリによって読み取られた列ストア セグメントの最小数。 null にすることはできません。 適用対象: SQL Server 2016 (13.x) SP2 および SQL Server 2017 (14.x) CU3 以降 |
max_columnstore_segment_reads | bigint | 1 回の実行中にクエリによって読み取られた列ストア セグメントの最大数。 null にすることはできません。 適用対象: SQL Server 2016 (13.x) SP2 および SQL Server 2017 (14.x) CU3 以降 |
total_columnstore_segment_skips | bigint | クエリによってスキップされた列ストア セグメントの合計。 null にすることはできません。 適用対象: SQL Server 2016 (13.x) SP2 および SQL Server 2017 (14.x) CU3 以降 |
last_columnstore_segment_skips | bigint | クエリの最後の実行によってスキップされた列ストア セグメントの数。 null にすることはできません。 適用対象: SQL Server 2016 (13.x) SP2 および SQL Server 2017 (14.x) CU3 以降 |
min_columnstore_segment_skips | bigint | 1 回の実行中にクエリによってスキップされた列ストア セグメントの最小数。 null にすることはできません。 適用対象: SQL Server 2016 (13.x) SP2 および SQL Server 2017 (14.x) CU3 以降 |
max_columnstore_segment_skips | bigint | 1 回の実行中にクエリによってスキップされた列ストア セグメントの最大数。 null にすることはできません。 適用対象: SQL Server 2016 (13.x) SP2 および SQL Server 2017 (14.x) CU3 以降 |
total_spills | bigint | コンパイル後にこのクエリの実行によってスピルされたページの合計数。 適用対象: SQL Server 2016 (13.x) SP2 および SQL Server 2017 (14.x) CU3 以降 |
last_spills | bigint | クエリが最後に実行された時点でスピルされたページの数。 適用対象: SQL Server 2016 (13.x) SP2 および SQL Server 2017 (14.x) CU3 以降 |
min_spills | bigint | このクエリが 1 回の実行中にスピルしたページの最小数。 適用対象: SQL Server 2016 (13.x) SP2 および SQL Server 2017 (14.x) CU3 以降 |
max_spills | bigint | このクエリが 1 回の実行中にスピルしたページの最大数。 適用対象: SQL Server 2016 (13.x) SP2 および SQL Server 2017 (14.x) CU3 以降 |
pdw_node_id | int | このディストリビューションがオンになっているノードの識別子。 適用対象: Azure Synapse Analytics、Analytics Platform System (PDW) |
total_page_server_reads | bigint | コンパイル後にこのプランの実行によって実行されたリモート ページ サーバーの読み取りの合計数。 適用対象: Azure SQL Database Hyperscale |
last_page_server_reads | bigint | プランが最後に実行された時点で実行されたリモート ページ サーバーの読み取りの数。 適用対象:Azure SQL Database Hyperscale |
min_page_server_reads | bigint | このプランが 1 回の実行中に実行したリモート ページ サーバーの読み取りの最小数。 適用対象:Azure SQL Database Hyperscale |
max_page_server_reads | bigint | このプランが 1 回の実行中に実行したリモート ページ サーバーの読み取りの最大数。 適用対象:Azure SQL Database Hyperscale |
Note
1 統計収集が有効になっているネイティブ コンパイル ストアド プロシージャの場合、ワーカー時間はミリ秒単位で収集されます。 クエリが 1 ミリ秒未満で実行される場合、値は 0 になります。
アクセス許可
SQL Server と SQL Managed Instance では、VIEW SERVER STATE
アクセス許可が必要です。
SQL Database の Basic、S0、S1 サービス対象、および Elastic Pool のデータベースの場合、サーバー管理者アカウント、Microsoft Entra 管理者アカウント、または ##MS_ServerStateReader##
サーバー ロールのメンバーシップが必要です。 他のすべての SQL Database サービス目標では、データベースに対する VIEW DATABASE STATE
アクセス許可または ##MS_ServerStateReader##
サーバー ロールのメンバーシップのいずれかが必要です。
SQL Server 2022 以降でのアクセス許可
サーバーに対する VIEW SERVER PERFORMANCE STATE アクセス許可が必要です。
解説
ビュー内の統計は、クエリが完了したときに更新されます。
例
A. TOP N クエリを確認する
次の例では、平均 CPU 時間の上位 5 個のクエリに関する情報を返します。 この例では、クエリ ハッシュに従ってクエリを集計して、論理的に等価のクエリを累積リソース使用量別にグループ化しています。 Sample_Statement_Text列には、クエリ ハッシュに一致するクエリ構造の例が示されていますが、ステートメント内の特定の値に関係なく読み取る必要があります。 たとえば、ステートメントに WHERE Id = 5
が含まれている場合は、より汎用的な形式で読み取ります。 WHERE Id = @some_value
SELECT TOP 5 query_stats.query_hash AS Query_Hash,
SUM(query_stats.total_worker_time) / SUM(query_stats.execution_count) AS Avg_CPU_Time,
MIN(query_stats.statement_text) AS Sample_Statement_Text
FROM
(SELECT QS.*,
SUBSTRING(ST.text, (QS.statement_start_offset/2) + 1,
((CASE statement_end_offset
WHEN -1 THEN DATALENGTH(ST.text)
ELSE QS.statement_end_offset END
- QS.statement_start_offset)/2) + 1) AS statement_text
FROM sys.dm_exec_query_stats AS QS
CROSS APPLY sys.dm_exec_sql_text(QS.sql_handle) as ST) as query_stats
GROUP BY query_stats.query_hash
ORDER BY 2 DESC;
B. クエリの行数集計を返す
次の例では、クエリに対して行数の集計情報 (行の総数、最小行数、最大行数、および最後の行) を返します。
SELECT qs.execution_count,
SUBSTRING(qt.text,qs.statement_start_offset/2 +1,
(CASE WHEN qs.statement_end_offset = -1
THEN LEN(CONVERT(nvarchar(max), qt.text)) * 2
ELSE qs.statement_end_offset end -
qs.statement_start_offset
)/2
) AS query_text,
qt.dbid, dbname= DB_NAME (qt.dbid), qt.objectid,
qs.total_rows, qs.last_rows, qs.min_rows, qs.max_rows
FROM sys.dm_exec_query_stats AS qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS qt
WHERE qt.text like '%SELECT%'
ORDER BY qs.execution_count DESC;
関連項目
実行関連の動的管理ビューと関数 (Transact-SQL)
sys.dm_exec_sql_text (Transact-SQL)
sys.dm_exec_query_plan (Transact-SQL)
sys.dm_exec_procedure_stats (Transact-SQL)
sys.dm_exec_trigger_stats (Transact-SQL)
sys.dm_exec_cached_plans (Transact-SQL)