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_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 | 時間,以微秒為單位報告(但只精確到毫秒),在編譯此計劃之後,透過執行此計劃,在 .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 Basic、S0和 S1 服務目標上,以及 彈性集區、伺服器管理員 帳戶、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;