sys.dm_exec_query_stats (Transact-SQL)
適用対象:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance
SQL Server でキャッシュされたクエリ プランの集計パフォーマンス統計を返します。 このビューには、キャッシュされたプラン内のクエリ ステートメントごとに 1 行が含まれており、その行の有効期間はプラン自体に関連付けられています。 つまり、プランがキャッシュから削除されると、対応する行もこのビューから削除されます。
sys.dm_exec_query_stats
の結果は、実行中のクエリではなく、完了したクエリのみがデータに反映されるため、実行ごとに異なる場合があります。
Azure Synapse Analytics または Analytics Platform System (PDW) の専用 SQL プールからこの DMV を呼び出すには、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 2019 (15.x) 以前のバージョンと Azure SQL Managed Instance には、VIEW SERVER STATE
アクセス許可が必要です。
SQL Server 2022 (16.x) 以降のバージョンでは、サーバーに対する VIEW SERVER PERFORMANCE STATE
アクセス許可が必要です。
Azure SQL Database Basic、S0、S1 サービス目標、および エラスティック プール内のデータベースの場合は、サーバー管理者 アカウント、Microsoft Entra 管理者 アカウント、または ##MS_ServerStateReader##
サーバー ロール のメンバーシップが必要です。 他のすべての SQL Database サービス目標では、データベースに対する VIEW DATABASE STATE
アクセス許可または ##MS_ServerStateReader##
サーバー ロールのメンバーシップのいずれかが必要です。
解説
ビュー内の統計は、クエリが完了したときに更新されます。
例
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;