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_offset statement_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 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 在上次執行此計畫期間,.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 二進位(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 此計畫自編譯後收到的 KB 保留記憶體授與總數。 查詢記憶體優化資料表一律為 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 此計畫自編譯以來估計的理想記憶體授與總數。 查詢記憶體優化資料表一律為 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。

適用于:從 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 針對啟用統計資料收集時原生編譯的預存程式,會以毫秒為單位收集背景工作時間。 如果查詢以不到一毫秒執行,則此值會是 0。

權限

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

在SQL 資料庫基本、S0 S1 服務目標上,以及彈性集 區中的 資料庫, 需要伺服器管理員 帳戶、 Microsoft Entra 系統管理員 帳戶或伺服器角色 的成員 ##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)