sys.dm_exec_query_stats (Transact-SQL)

適用於:SQL ServerAzure SQL DatabaseAzure SQL 受控執行個體

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

注意

  • 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) 這是指唯一識別所屬批次或預存程序的 Token。

sql_handle 再配合 statement_start_offsetstatement_end_offset,可藉由呼叫 sys.dm_exec_sql_text 動態管理函數來擷取查詢的 SQL 文字。
statement_start_offset int 表示資料列於其批次或保存物件的文字中所描述之查詢的起始位置 (由 0 開始並以位元組為單位)。
statement_end_offset int 表示資料列於其批次或保存物件的文字中所描述之查詢的結束位置 (由 0 開始並以位元組為單位)。 對於 2014 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 這個計畫在單次執行期間曾經耗用的最少 CPU 時間 (以毫秒為單位來報告,但是精確度只到毫秒)。 1
max_worker_time bigint 這個計畫在單次執行期間曾經耗用的最多 CPU 時間 (以毫秒為單位來報告,但是精確度只到毫秒)。 1
total_physical_reads bigint 這個計畫在編譯以來執行所執行的實體讀取總數。

查詢記憶體最佳化的資料表時一律為 0。
last_physical_reads bigint 計畫上次執行所執行的實體讀取數。

查詢記憶體最佳化的資料表時一律為 0。
min_physical_reads bigint 這個計畫在單次期間曾執行的最小實體讀取數。

查詢記憶體最佳化的資料表時一律為 0。
max_physical_reads bigint 這個計畫在單次執行期間曾執行的最大實體讀取數。

查詢記憶體最佳化的資料表時一律為 0。
total_logical_writes bigint 這個計畫在編譯以來執行所執行的邏輯寫入總數。

查詢記憶體最佳化的資料表時一律為 0。
last_logical_writes bigint 最近完成計畫執行期間所變更的緩衝集區頁面數目。

讀取頁面之後,頁面只會在第一次修改時變成已變更。 當頁面變成已變更時,這個數位會遞增。 已變更頁面的後續修改不會影響此號碼。

查詢記憶體優化資料表時,這個數位一律為 0。
min_logical_writes bigint 這個計畫在單次執行期間曾執行的最小邏輯寫入數。

查詢記憶體最佳化的資料表時一律為 0。
max_logical_writes bigint 這個計畫在單次執行期間曾執行的最大邏輯寫入數。

查詢記憶體最佳化的資料表時一律為 0。
total_logical_reads bigint 這個計畫在編譯以來執行所執行的邏輯讀取總數。

查詢記憶體最佳化的資料表時一律為 0。
last_logical_reads bigint 計畫上次執行所執行的邏輯讀取數。

查詢記憶體最佳化的資料表時一律為 0。
min_logical_reads bigint 這個計畫在單次執行期間曾執行的最小邏輯讀取數。

查詢記憶體最佳化的資料表時一律為 0。
max_logical_reads bigint 這個計畫在單次執行期間曾經執行的最大邏輯讀取數。

查詢記憶體最佳化的資料表時一律為 0。
total_clr_time bigint (以微秒回報的時間,但只有在 Microsoft .NET Framework Common Language Runtime (CLR) 物件執行之後,才會精確到毫秒) 。 CLR 物件可以是預存程序、函數、觸發程序、類型和彙總。
last_clr_time bigint 在上次執行此計畫期間,以微秒為單位報告的時間 (,但只有) 在 CLR 物件內執行期間,.NET Framework CLR 物件所耗用的毫秒。 CLR 物件可以是預存程序、函數、觸發程序、類型和彙總。
min_clr_time bigint 在單一執行期間,此計畫在 clR 物件內.NET Framework取用的時間下限 (,但只精確到毫秒) 。 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 二進位 (8) 針對查詢所計算的二進位雜湊值,可用來識別含有類似邏輯的查詢。 您可以使用查詢雜湊判別只有常值不同之查詢的彙總資源使用狀況。
query_plan_hash binary (8) 從查詢執行計畫計算所得的二進位雜湊值將用於識別類似的查詢執行計畫。 您可以使用查詢計劃雜湊尋找具有類似執行計畫之查詢的累計成本。

當原生編譯的預存程序查詢記憶體最佳化的資料表時,一律為 0x000。
total_rows bigint 查詢傳回的資料列總數。 不可以是 null。

當原生編譯的預存程序查詢記憶體最佳化的資料表時,一律為 0。
last_rows bigint 上次執行查詢時所傳回的資料列數目。 不可以是 null。

當原生編譯的預存程序查詢記憶體最佳化的資料表時,一律為 0。
min_rows bigint 查詢在一次執行期間傳回的資料列數目下限。 不可以是 null。

當原生編譯的預存程序查詢記憶體最佳化的資料表時,一律為 0。
max_rows bigint 查詢在一次執行期間傳回的資料列數目上限。 不可以是 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 此計畫在一次執行期間所使用的平行處理原則程度下限。 查詢記憶體優化資料表一律為 0。

適用於:SQL Server 2016 (13.x) 和更新版本。
max_dop bigint 此計畫在一次執行期間所使用的平行處理原則程度上限。 查詢記憶體優化資料表一律為 0。

適用於:SQL Server 2016 (13.x) 和更新版本。
total_grant_kb bigint 自編譯以來,此計畫收到的保留記憶體授與總數。 查詢記憶體優化資料表一律為 0。

適用於:SQL Server 2016 (13.x) 和更新版本。
last_grant_kb bigint 上次執行此計畫時,以 KB 為單位的保留記憶體授與數量。 查詢記憶體優化資料表一律為 0。

適用於:SQL Server 2016 (13.x) 和更新版本。
min_grant_kb bigint 此計畫在一次執行期間收到的最小保留記憶體授與數量。 查詢記憶體優化資料表一律為 0。

適用於:SQL Server 2016 (13.x) 和更新版本。
max_grant_kb bigint 此計畫在一次執行期間收到的保留記憶體授與數量上限。 查詢記憶體優化資料表一律為 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 此計畫在一次執行期間所使用的記憶體授與數量下限。 查詢記憶體優化資料表一律為 0。

適用於:SQL Server 2016 (13.x) 和更新版本。
max_used_grant_kb bigint 此計畫在一次執行期間所使用的記憶體授與數量上限。 查詢記憶體優化資料表一律為 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 此計畫在一次執行期間預估的最小理想記憶體授與數量。 查詢記憶體優化資料表一律為 0。

適用於:SQL Server 2016 (13.x) 和更新版本。
max_ideal_grant_kb bigint 此計畫在一次執行期間預估的理想記憶體授與數量上限。 查詢記憶體優化資料表一律為 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 此計畫在一次執行期間所使用的保留平行線程數目下限。 查詢記憶體優化資料表一律為 0。

適用於:SQL Server 2016 (13.x) 和更新版本。
max_reserved_threads bigint 此計畫在一次執行期間使用的最大保留平行線程數目。 查詢記憶體優化資料表一律為 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 此計畫在一次執行期間所使用的平行線程數目下限。 查詢記憶體優化資料表一律為 0。

適用於:SQL Server 2016 (13.x) 和更新版本。
max_used_threads bigint 此計畫在一次執行期間使用的最大已使用平行線程數目。 查詢記憶體優化資料表一律為 0。

適用於:SQL Server 2016 (13.x) 和更新版本。
total_columnstore_segment_reads bigint 查詢所讀取的資料行存放區區段總和。 不可以是 null。

適用于:從 2016 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 查詢在一次執行期間讀取的資料行存放區區段數目下限。 不可以是 null。

適用于:從 SQL Server 2016 (13.x) SP2 和 SQL Server 2017 (14.x) CU3 開始
max_columnstore_segment_reads bigint 一次執行期間查詢所讀取的資料行存放區區段數目上限。 不可以是 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 查詢在一次執行期間略過的資料行存放區區段數目下限。 不可以是 null。

適用于:從 SQL Server 2016 (13.x) SP2 和 SQL Server 2017 (14.x) CU3 開始
max_columnstore_segment_skips bigint 查詢在一次執行期間略過的資料行存放區區段數目上限。 不可以是 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 此查詢在單一執行期間曾溢出的最小頁數。

適用于:從 SQL Server 2016 (13.x) SP2 和 SQL Server 2017 (14.x) CU3 開始
max_spills bigint 此查詢在單一執行期間曾溢出的頁數上限。

適用于:從 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資料庫超大規模資料庫
last_page_server_reads bigint 上次執行計畫時執行的遠端頁面伺服器讀取數目。

適用于:Azure SQL資料庫超大規模資料庫
min_page_server_reads bigint 在單一執行期間,此計畫曾執行的遠端頁面伺服器讀取數目下限。

適用于:Azure SQL資料庫超大規模資料庫
max_page_server_reads bigint 在單一執行期間,此計畫曾執行的遠端頁面伺服器讀取數目上限。

適用于:Azure SQL資料庫超大規模資料庫

注意

1 針對啟用統計資料收集時原生編譯的預存程式,會以毫秒為單位收集背景工作時間。 如果查詢以小於 1 毫秒執行,此值會是 0。

權限

在 SQL Server 和 SQL 受控執行個體上,需要 VIEW SERVER STATE 權限。

在 SQL Database [Basic]、[S0] 和 [S1] 服務目標,以及彈性集區中的資料庫,需要伺服器管理員帳戶、Azure Active Directory 管理員帳戶或##MS_ServerStateReader##伺服器角色的成員資格。 在所有其他 SQL Database 服務目標上,需要資料庫的 VIEW DATABASE STATE 權限或 ##MS_ServerStateReader## 伺服器角色的成員資格。

SQL Server 2022 及更新版本的權限

需要伺服器上的 VIEW SERVER PERFORMANCE STATE 權限。

備註

完成查詢時,會更新檢視中的統計資料。

範例

A. 尋找 TOP N 查詢

下列範例會傳回以平均 CPU 時間排名的前五個查詢的相關資訊。 這個範例會根據查詢雜湊彙總查詢,以便依據累計資源耗用量分組邏輯對等查詢。 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)