sys.dm_exec_query_profiles (Transact-SQL)
適用於:SQL ServerAzure SQL 資料庫 Azure SQL 受控執行個體
監視查詢執行時即時查詢進度。 例如,使用此 DMV 來判斷查詢的哪個部分執行速度緩慢。 使用描述欄位中識別的數據行,將此 DMV 與其他系統 DMV 聯結。 或者,使用時間戳數據行,將此 DMV 與其他性能計數器聯結(例如 效能監視器、xperf)。
傳回的資料表
傳回的計數器是每個線程的每個運算元。 結果是動態的,不符合現有選項的結果,例如 SET STATISTICS XML ON
只有在查詢完成時才會建立輸出。
資料行名稱 | 資料類型 | 描述 |
---|---|---|
session_id | smallint | 識別此查詢執行所在的會話。 參考dm_exec_sessions.session_id。 |
request_id | int | 識別目標要求。 參考dm_exec_sessions.request_id。 |
sql_handle | varbinary(64) | 這是指唯一識別所屬批次或預存程序的 Token。 參考dm_exec_query_stats.sql_handle。 |
plan_handle | varbinary(64) | 這是標記,可唯一識別已執行之批次的查詢執行計劃,且其計劃位於計劃快取中,或目前正在執行中。 參考dm_exec_query_stats.plan_handle。 |
physical_operator_name | nvarchar(256) | 實體運算子名稱。 |
node_id | int | 識別查詢樹狀結構中的運算子節點。 |
thread_id | int | 區分屬於相同查詢運算子節點的線程(適用於平行查詢)。 |
task_address | varbinary(8) | 識別此線程正在使用的SQLOS工作。 參考 dm_os_tasks.task_address。 |
row_count | bigint | 到目前為止,運算符所傳回的數據列數目。 |
rewind_count | bigint | 到目前為止,倒轉次數。 |
rebind_count | bigint | 到目前為止,重新系結的數目。 |
end_of_scan_count | bigint | 到目前為止的掃描結束次數。 |
estimate_row_count | bigint | 估計的數據列數目。 與實際row_count比較estimated_row_count很有用。 |
first_active_time | bigint | 第一次呼叫運算子的時間,以毫秒為單位。 |
last_active_time | bigint | 上次呼叫運算子的時間,以毫秒為單位。 |
open_time | bigint | 開啟時的時間戳(以毫秒為單位)。 |
first_row_time | bigint | 第一個數據列開啟時的時間戳(以毫秒為單位)。 |
last_row_time | bigint | 開啟最後一個數據列的時間戳(以毫秒為單位)。 |
close_time | bigint | 關閉時的時間戳(以毫秒為單位)。 |
elapsed_time_ms | bigint | 到目前為止,目標節點作業所使用的總經過時間(以毫秒為單位)。 |
cpu_time_ms | bigint | 到目前為止,目標節點作業所使用的CPU時間總計(以毫秒為單位)。 |
database_id | smallint | 資料庫標識碼,其中包含執行讀取和寫入的物件。 |
object_id | int | 執行讀取和寫入之物件的標識碼。 參考sys.objects.object_id。 |
index_id | int | 索引 (如果有的話)會針對 開啟數據列集。 |
scan_count | bigint | 到目前為止,數據表/索引掃描的數目。 |
logical_read_count | bigint | 到目前為止的邏輯讀取數目。 |
physical_read_count | bigint | 到目前為止的實體讀取數目。 |
read_ahead_count | bigint | 到目前為止,讀取前的次數。 |
write_page_count | bigint | 到目前為止,由於溢出,頁面寫入次數。 |
lob_logical_read_count | bigint | 到目前為止,LOB 邏輯讀取數目。 |
lob_physical_read_count | bigint | 到目前為止,LOB 實體讀取的數目。 |
lob_read_ahead_count | bigint | 到目前為止,LOB 讀取前行的數目。 |
segment_read_count | int | 目前為止的區段讀取前線數目。 |
segment_skip_count | int | 到目前為止略過的區段數目。 |
actual_read_row_count | bigint | 套用剩餘述詞之前,運算符所讀取的數據列數目。 |
estimated_read_row_count | bigint | 適用於: 從 SQL Server 2016 (13.x) SP1 開始。 套用剩餘述詞之前,運算符估計要讀取的數據列數目。 |
一般備註
如果查詢計劃節點沒有任何 I/O,所有 I/O 相關計數器都會設定為 NULL。
此 DMV 所報告的 I/O 相關計數器比下列兩種方式所報告的 SET STATISTICS IO
計數器更細微:
SET STATISTICS IO
將所有 I/O 的計數器群組在一起至指定的數據表。 使用此 DMV,您將針對執行資料表 I/O 的查詢計劃中每個節點,取得個別的計數器。如果有平行掃描,此 DMV 會報告掃描中每個平行線程的計數器。
從 SQL Server 2016 (13.x) SP1 開始,標準查詢執行統計數據分析基礎結構會與輕量型查詢執行統計數據分析基礎結構並存。 SET STATISTICS XML ON
和 SET STATISTICS PROFILE ON
一律使用 標準查詢執行統計數據分析基礎結構。 sys.dm_exec_query_profiles
若要填入,必須啟用其中一個查詢分析基礎結構。 如需詳細資訊,請參閱查詢分析基礎結構。
注意
調查中的查詢在啟用查詢分析基礎結構之後必須啟動,在查詢啟動之後啟用查詢將不會產生結果sys.dm_exec_query_profiles
。 如需如何啟用查詢分析基礎結構的詳細資訊,請參閱 查詢分析基礎結構。
權限
- 在 SQL Server 和 Azure SQL 受控執行個體 上,需要
VIEW DATABASE STATE
資料庫角色的許可權和成員資格db_owner
。 - 在 Azure SQL 資料庫 進階層上,需要
VIEW DATABASE STATE
資料庫中的許可權。 - 在 Azure SQL 資料庫 Basic、S0 和 S1 服務目標上,以及彈性集區中的資料庫,需要伺服器管理員帳戶或 Microsoft Entra 系統管理員帳戶。 在所有其他 SQL 資料庫 服務目標上,
VIEW DATABASE STATE
資料庫需要許可權。
SQL Server 2022 和更新版本的權限
需要資料庫上的 VIEW DATABASE PERFORMANCE STATE 權限。
範例
步驟 1:登入您打算在其中執行您將使用 sys.dm_exec_query_profiles
分析查詢的工作階段。 若要設定用於分析的查詢,請使用 SET STATISTICS PROFILE ON
。 在此相同的工作階段中執行您的查詢。
--Configure query for profiling with sys.dm_exec_query_profiles
SET STATISTICS PROFILE ON;
GO
--Or enable query profiling globally under SQL Server 2016 SP1 or above (not needed in SQL Server 2019)
DBCC TRACEON (7412, -1);
GO
--Next, run your query in this session, or in any other session if query profiling has been enabled globally
步驟 2:登入與查詢執行所在的會話不同的第二個會話。
下列語句摘要說明查詢目前在會話 54 中執行的進度。 若要這樣做,它會計算每個節點所有線程的輸出數據列總數,並將它與該節點的估計輸出數據列數目進行比較。
--Run this in a different session than the session in which your query is running.
--Note that you may need to change session id 54 below with the session id you want to monitor.
SELECT node_id,physical_operator_name, SUM(row_count) row_count,
SUM(estimate_row_count) AS estimate_row_count,
CAST(SUM(row_count)*100 AS float)/SUM(estimate_row_count)
FROM sys.dm_exec_query_profiles
WHERE session_id=54
GROUP BY node_id,physical_operator_name
ORDER BY node_id;