sys.dm_exec_query_profiles (Transact-SQL)
正执行查询时监视实时查询进度。 计数器基于每个运算符和每个线程。 当查询完成后,所收集的数据将序列化为 SHOWPLAN XML。 可使用此 DMV 监视查询执行的进度和确定查询使用最多时间的位置。 可使用说明字段中标识的列,将此 DMV 与其他系统 DMV 相联接。 可使用时间戳列,将此 DMV 与其他性能计数器(如性能监视器 xperf)相联接。
重要提示 |
---|
要返回信息,必须设置 SET STATISTICS PROFILE ON; 或 SET STATISTICS XML ON;。 |
适用范围:SQL Server(SQL Server 2014 到当前版本)。 |
返回的表
列名 |
数据类型 |
说明 |
---|---|---|
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 |
迄今为止的扫描结束次数。 |
first_active_time |
bigint |
首次调用构造函数的时间(毫秒)。 |
estimate_row_count |
bigint |
估计的行数。 可用于将 estimated_row_count 与实际 row_count 进行比较。 |
last_active_time |
bigint |
上次调用构造函数的时间(毫秒)。 |
open_time |
bigint |
目标节点的操作(例如 open/close/getrow)迄今为止累积的总 CPU 时间(毫秒)。 |
first_row_time |
bigint |
打开时的时间戳(毫秒)。 |
last_row_time |
bigint |
获取第一行时的时间戳(毫秒)。 |
close_time |
bigint |
关闭时的时间戳(毫秒)。 |
elapsed_time_ms |
bigint |
迄今为止,看到节点处于执行状态的最新时间。 |
cpu_time_ms |
bigint |
目标节点的操作(例如 open/close/getrow)迄今为止累积的总占用时间(毫秒)。 |
database_id |
smallint |
打开其行集的数据库。 |
object_id |
int |
打开其行集的表。 |
index_id |
int |
打开其行级的索引(如果有)。 |
scan_count |
bigint |
迄今为止的表/索引扫描数。 |
logical_read_count |
bigint |
迄今为止的逻辑读取数。 |
physical_read_count |
bigint |
迄今为止的物理读取数。 |
read_ahead_count |
bigint |
迄今为止的预读数。 |
write_page_count |
bigint |
迄今为止由于溢出而导致的页写入数。 |
lob_scan_count |
bigint |
迄今为止的 LOB 表/索引扫描数。 |
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 |
迄今为止跳过的段数。 |
注释
这些 ID 列是此 DMV 的主键以及将此 DMV 与其他 DMV 关联的外键。 计数器粗略可分为两类:一类是累积计数器(如 row_count、elapsed_time_ms),第二类是时间戳。 时间戳标记特定事件发生的时间,可用来将这些事件与 SQL Server 外部的数据相关联。 此类数据的示例有 perfmon、XPerf 等。
计数器提供数据的粒度比 SET STATISTICS IO ON 更精细,因为这些计数器是按每个迭代器和每个线程来计数的。 线程的总和应等于原始 STATISTICS IO 结果的总数。 如果节点没有 IO 计数器,则 SE 字段将为 NULL。
权限
要求具有对服务器的 VIEW SERVER STATE 权限。
关系基数
sys.dm_exec_query_profiles.session_id |
sys.dm_exec_sessions.session_id |
一对一 |
sys.dm_exec_query_profiles.request_id |
sys.dm_exec_sessions.request_id |
多对一 |
sys.dm_exec_query_profiles.sql_handle |
sys.dm_exec_query_stats.sql_handle |
多对一 |
sys.dm_exec_query_profiles.plan_handle |
ys.dm_exec_query_stats.plan_handle |
多对一 |
sys.dm_exec_query_profiles.task_address |
sys.dm_os_tasks.task_address |
多对一 |
sys.dm_exec_query_profiles.database_id |
sys.databases.database_id |
多对一 |
sys.dm_exec_query_profiles.object_id |
sys.objects.object_id |
多对一 |
sys.dm_exec_query_profiles.index_id |
sys.indexes.index_id |
多对一 |
示例
以下语句返回有关查询运算符的信息。
SET STATISTICS PROFILE ON;
GO
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;