sys.dm_exec_query_profiles (Transact-SQL)

适用于:SQL Server Azure 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) 是唯一标识查询所属的批处理或存储过程的令牌。 引用 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 估计的行数。 可用于将 estimated_row_count 与实际 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 包含要对其进行读写的对象的数据库的 ID。
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 数据库基本、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)