适用于:SQL Server
Azure SQL 数据库
Azure SQL 托管实例
Microsoft Fabric 中的 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;