sys.dm_exec_query_stats (Transact-SQL)

キャッシュされたクエリ プランの集計パフォーマンス統計を返します。このビューには、キャッシュされたプラン内のクエリ ステートメントごとに 1 行が含まれており、その行の有効期間はプラン自体に関連付けられています。つまり、プランがキャッシュから削除されると、対応する行もこのビューから削除されます。

注意

サーバーで現在実行中のワークロードが存在する場合、sys.dm_exec_query_stats の最初のクエリでは不正確な結果が返されることがあります。クエリを再実行すると、より正確な結果を確認できます。

列名

データ型

説明

sql_handle

varbinary(64)

クエリが含まれているバッチまたはストアド プロシージャを参照するトークンを指定します。

sql_handlestatement_start_offset および statement_end_offset と共に使用し、sys.dm_exec_sql_text 動的管理関数を呼び出して、クエリの SQL テキストを取得できます。

statement_start_offset

int

バッチまたは保存されるオブジェクトのテキスト内での、行が示すクエリの開始位置 (バイト単位)。0 で始まります。

statement_end_offset

int

バッチまたは保存されるオブジェクトのテキスト内での、行が示すクエリの終了位置 (バイト単位)。0 で始まります。値 -1 はバッチの最後を表します。

plan_generation_num

bigint

再コンパイル後、プランのインスタンスを区別するために使用できるシーケンス番号。

plan_handle

varbinary(64)

クエリが含まれているコンパイル済みのプランを参照するトークン。この値を sys.dm_exec_query_plan 動的管理関数に渡して、クエリ プランを取得できます。

creation_time

datetime

プランがコンパイルされた時刻。

last_execution_time

datetime

前回プランの実行が開始された時刻。

execution_count

bigint

前回のコンパイル時以降に、プランが実行された回数。

total_worker_time

bigint

コンパイル後にプランの実行で使用された CPU 時間の合計 (マイクロ秒単位)。ただし、精度はミリ秒単位までです。

last_worker_time

bigint

プランを前回実行したときに使用された CPU 時間 (マイクロ秒単位)。ただし、精度はミリ秒単位までです。

min_worker_time

bigint

プランの 1 回の実行で使用された最小 CPU 時間 (マイクロ秒単位)。ただし、精度はミリ秒単位までです。

max_worker_time

bigint

プランの 1 回の実行で使用された最大 CPU 時間 (マイクロ秒単位)。ただし、精度はミリ秒単位までです。

total_physical_reads

bigint

コンパイル後にこのプランの実行で行われた物理読み取りの合計数。

last_physical_reads

bigint

プランを前回実行したときに行われた物理読み取りの数。

min_physical_reads

bigint

プランの 1 回の実行で行われた物理読み取りの最小数。

max_physical_reads

bigint

プランの 1 回の実行で行われた物理読み取りの最大数。

total_logical_writes

bigint

コンパイル後にプランの実行で行われた論理書き込みの合計数。

last_logical_writes

bigint

プランを前回実行したときに行われた論理書き込みの数。

min_logical_writes

bigint

プランの 1 回の実行で行われた論理書き込みの最小数。

max_logical_writes

bigint

プランの 1 回の実行で行われた論理書き込みの最大数。

total_logical_reads

bigint

コンパイル後にこのプランの実行で行われた論理読み取りの合計数。

last_logical_reads

bigint

プランを前回実行したときに行われた論理読み取りの数。

min_logical_reads

bigint

プランの 1 回の実行で行われた論理読み取りの最小数。

max_logical_reads

bigint

プランの 1 回の実行で行われた論理読み取りの最大数。

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)

クエリ実行プランで計算され、同様のクエリ実行プランを識別するために使用される、バイナリのハッシュ値です。クエリ プラン ハッシュを使用して、同様の実行プランを持つクエリの累積コストを確認できます。詳細については、「クエリおよびクエリ プラン ハッシュを使用した類似クエリの検索およびチューニング」を参照してください。

total_rows

bigint

クエリによって返される行の合計数。NULL にすることはできません。

last_rows

bigint

クエリの前回の実行で返された行数。NULL にすることはできません。

min_rows

bigint

前回のコンパイル時以降に、プランが実行された回数を超える、クエリによって返された行の最小数。NULL にすることはできません。

max_rows

bigint

前回のコンパイル時以降に、プランが実行された回数を超える、クエリによって返された行の最大数。NULL にすることはできません。

権限

サーバーに対する VIEW SERVER STATE 権限が必要です。

説明

ビュー内の統計は、クエリが完了したときに更新されます。

使用例

A. TOP N クエリを確認する

次の例では、CPU の平均時間で順位付けされた上位 5 つのクエリに関する情報を返します。この例では、クエリ ハッシュに従ってクエリを集計して、論理的に等価のクエリを累積リソース使用量別にグループ化しています。

USE AdventureWorks2008R2;
GO
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 "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;
GO

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;