次の方法で共有


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_handlestatement_start_offsetstatement_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 BasicS0S1 サービス目標、および エラスティック プール内のデータベースの場合は、サーバー管理者 アカウント、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;