sys.dm_exec_query_stats (Transact-SQL)

適用対象:SQL ServerAzure SQL DatabaseAzure 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 サービス目標、およびエラスティック プール内のデータベースの場合、サーバー管理者アカウント、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)