sys.dm_exec_query_profiles (Transact-SQL)

適用於:SQL ServerAzure SQL DatabaseAzure 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 ONSET 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 資料庫基本、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;  

另請參閱

動態管理檢視和函數 (Transact-SQL)
執行相關的動態管理檢視和函數 (Transact-SQL)