sys.dm_exec_query_stats (Transact-SQL)

傳回 SQL Server 2012 中之快取查詢計畫的彙總效能統計資料。 此檢視會針對快取計畫內的每個查詢陳述式包含一個資料列,而資料列的存留期取決於計畫本身。 從快取移除計畫時,對應的資料列也會從這個檢視中刪除。

[!附註]

如果伺服器上目前有工作負載正在執行,sys.dm_exec_query_stats 的初始查詢所產生的結果可能並不精確。 您可以重複執行查詢,以找出較精確的結果。

資料行名稱

資料類型

說明

sql_handle

varbinary(64)

這是指查詢所屬批次或預存程序的 Token。

sql_handle 再配合 statement_start_offsetstatement_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 AdventureWorks2012;
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;

請參閱

參考

動態管理檢視和函數 (Transact-SQL)

執行相關的動態管理檢視和函數 (Transact-SQL)

sys.dm_exec_sql_text (Transact-SQL)

sys.dm_exec_query_plan (Transact-SQL)