sys.dm_exec_query_stats (Transact-SQL)
傳回快取查詢計畫的彙總效能統計資料。這個檢視會針對快取計畫內的每個查詢陳述式,各傳回一個資料列,而資料列的存留期會視計畫本身而定。從快取移除計畫時,對應的資料列也會從這個檢視中刪除。
[!附註]
如果伺服器上目前有工作負載正在執行,sys.dm_exec_query_stats 的初始查詢所產生的結果可能並不精確。您可以重複執行查詢,以找出較精確的結果。
資料行名稱 |
資料類型 |
說明 |
---|---|---|
sql_handle |
varbinary(64) |
這是指查詢所屬批次或預存程序的 Token。 sql_handle 再配合 statement_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) |
指查詢所屬編譯計畫的 Token。此值可以傳遞至 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 |
這個計畫在單次執行期間曾經耗用的最少 CPU 時間 (以毫秒為單位來報告,但是精確度只到毫秒)。 |
max_worker_time |
bigint |
這個計畫在單次執行期間曾經耗用的最多 CPU 時間 (以毫秒為單位來報告,但是精確度只到毫秒)。 |
total_physical_reads |
bigint |
這個計畫在編譯以來執行所執行的實體讀取總數。 |
last_physical_reads |
bigint |
計畫上次執行所執行的實體讀取數。 |
min_physical_reads |
bigint |
這個計畫在單次期間曾執行的最小實體讀取數。 |
max_physical_reads |
bigint |
這個計畫在單次執行期間曾執行的最大實體讀取數。 |
total_logical_writes |
bigint |
這個計畫在編譯以來執行所執行的邏輯寫入總數。 |
last_logical_writes |
bigint |
計畫上次執行所執行的邏輯寫入數。 |
min_logical_writes |
bigint |
這個計畫在單次執行期間曾執行的最小邏輯寫入數。 |
max_logical_writes |
bigint |
這個計畫在單次執行期間曾執行的最大邏輯寫入數。 |
total_logical_reads |
bigint |
這個計畫在編譯以來執行所執行的邏輯讀取總數。 |
last_logical_reads |
bigint |
計畫上次執行所執行的邏輯讀取數。 |
min_logical_reads |
bigint |
這個計畫在單次執行期間曾執行的最小邏輯讀取數。 |
max_logical_reads |
bigint |
這個計畫在單次執行期間曾經執行的最大邏輯讀取數。 |
total_clr_time |
bigint |
這個計畫從編譯以來執行的 Microsoft .NET Framework Common Language Runtime (CLR) 物件內部耗用的時間 (以毫秒為單位來報告,但是精確度只到毫秒)。CLR 物件可以是預存程序、函數、觸發程序、類型和彙總。 |
last_clr_time |
bigint |
這個計畫上一次執行期間,在 .NET Framework CLR 物件內部執行所耗用的時間 (以毫秒為單位來報告,但是精確度只到毫秒)。CLR 物件可以是預存程序、函數、觸發程序、類型和彙總。 |
min_clr_time |
bigint |
這個計畫在單次執行期間於 .NET Framework CLR 物件內部曾經耗用的最少時間 (以毫秒為單位來報告,但是精確度只到毫秒)。CLR 物件可以是預存程序、函數、觸發程序、類型和彙總。 |
max_clr_time |
bigint |
這個計畫在單次執行期間於 .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 時間之前五項查詢的相關資訊。這個範例會根據查詢雜湊彙總查詢,以便依據累計資源耗用量分組邏輯對等查詢。
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;