共用方式為


sys.dm_exec_query_stats (Transact-SQL)

適用於:SQL ServerAzure SQL 資料庫Azure SQL 受控執行個體

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

sys.dm_exec_query_stats 的結果可能會隨著每個執行而有所不同,因為數據只會反映已完成的查詢,而不是仍在進行中的查詢。

若要從 Azure Synapse Analytics 或 Analytics Platform System (PDW) 中的專用 SQL 集區呼叫此 DMV,請使用名稱 sys.dm_pdw_nodes_exec_query_stats。 針對無伺服器 SQL 集區,請使用 sys.dm_exec_query_stats

資料行名稱 資料類型 描述
sql_handle varbinary(64) 可唯一識別查詢所屬批次或預存程式的令牌。

sql_handle,連同 statement_start_offsetstatement_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 時間,以微秒為單位報告(但只精確到毫秒),在編譯此計劃之後,透過執行此計劃,在 .NET Framework Common Language Runtime (CLR) 物件 Microsoft內取用。 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 2019 (15.x) 和舊版,以及 Azure SQL 受控實例需要 VIEW SERVER STATE 許可權。

SQL Server 2022 (16.x) 和更新版本需要伺服器上 VIEW SERVER PERFORMANCE STATE 許可權。

在 Azure SQL Database BasicS0S1 服務目標上,以及 彈性集區伺服器管理員 帳戶、Microsoft Entra admin 帳戶,或 ##MS_ServerStateReader##伺服器角色 的成員資格。 在所有其他 SQL Database 服務目標上,需要資料庫的 VIEW DATABASE STATE 權限或 ##MS_ServerStateReader## 伺服器角色的成員資格。

備註

檢視中的統計數據會在查詢完成時更新。

範例

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;