适用于:SQL Server
Azure SQL 数据库
Azure SQL 托管实例
Azure Synapse Analytics
Microsoft Fabric中的SQL分析端点
Microsoft Fabric中的仓库
Microsoft Fabric中的SQL数据库
返回有关在 SQL Server 中正在执行的每个请求的信息。 有关请求的详细信息,请参阅 线程和任务体系结构指南。
Note
如果要用Azure Synapse Analytics专用SQL池调用,请参见sys.dm_pdw_exec_requests。 对于无服务器 SQL 池或 Microsoft Fabric,请使用 sys.dm_exec_requests。
| 列名称 | 数据类型 | 说明 |
|---|---|---|
session_id |
smallint | 与此请求相关的会话的 ID。 不可为 null。 |
request_id |
int | 请求的 ID。 在会话的上下文中是唯一的。 不可为 null。 |
start_time |
datetime | 请求到达时的时间戳。 不可为 null。 |
status |
nvarchar(30) | 请求的状态。 可以是以下其中一个值: 后台的 回滚 正在运行 可运行 休眠 暂停 不可为 null。 |
command |
nvarchar(32) | 标识正在处理的命令的当前类型。 常用命令类型包括以下值: SELECT INSERT UPDATE DELETE BACKUP 日志 BACKUP DATABASE DBCC 为 可以使用与请求对应的 sys.dm_exec_sql_text文本来检索sql_handle请求的文本。 内部系统进程将基于它们所执行任务的类型来设置该命令。 这些任务可以包括以下值:锁定监视器 CHECKPOINTLAZY WRITER 不可为 null。 |
sql_handle |
varbinary(64) | 唯一标识查询所属的批处理或存储过程的令牌。 可以为 NULL。 |
statement_start_offset |
int | 以字节为单位表示当前正在执行的批处理或持久化对象的当前正在执行的语句的起始位置,从 0 开始。 可以与 sql_handle、statement_end_offset 和 sys.dm_exec_sql_text 动态管理函数一起使用,以便为请求检索当前正在执行的语句。 可以为 NULL。 |
statement_end_offset |
int | 以字节为单位表示当前正在执行的批处理或持久化对象的当前正在执行的语句的结束位置,从 0 开始。 可以与 sql_handle、statement_start_offset 和 sys.dm_exec_sql_text 动态管理函数一起使用,以便为请求检索当前正在执行的语句。 可以为 NULL。 |
plan_handle |
varbinary(64) | 一个令牌,用于唯一标识当前正在执行的批处理的查询执行计划。 可以为 NULL。 |
database_id |
smallint | 对其执行请求的数据库的 ID。 不可为 null。 在 Azure SQL 数据库中,这些值在单一数据库或弹性池中是唯一的,但在逻辑服务器中不是唯一的。 |
user_id |
int | 提交请求的用户的 ID。 不可为 null。 |
connection_id |
uniqueidentifier | 请求到达时所采用的连接的 ID。 可以为 NULL。 |
blocking_session_id |
smallint | 正在阻塞请求的会话的 ID。 如果此列或NULL0未阻止请求,或者阻止会话的会话信息不可用(或无法识别)。 有关详细信息,请参阅了解并解决 SQL Server 阻塞问题。-2 = 阻塞资源由孤立的分布式事务拥有。 -3 = 阻塞资源由延迟的恢复事务拥有。 -4 = session_id 由于内部闩锁状态转换,目前无法确定阻塞闩锁所有者。-5
=
session_id 无法确定阻塞闩锁的所有者,因为它未跟踪此闩锁类型(例如,对于 SH 闩锁)。本身 blocking_session_id-5 ,并不表示性能问题。
-5 指示会话正在等待异步操作完成。 在引入之前-5,即使它仍处于等待状态,也会显示blocking_session_id0同一会话。根据工作负荷,观察 blocking_session_id = -5 可能是常见的情况。 |
wait_type |
nvarchar(60) | 如果请求当前被阻塞,则此列返回等待类型。 可以为 NULL。 当请求使用多个任务(例如,由于查询内并行性)时,任务可以等待具有不同等待类型的不同资源。 当同一请求的其他任务继续执行时,可以阻止任务。 若要查找每个任务的等待类型和持续时间以及它是否被阻止,请使用 sys.dm_os_waiting_tasks。 有关等待类型的信息,请参阅 sys.dm_os_wait_stats。 |
wait_time |
int | 如果请求当前被阻塞,则此列返回当前等待的持续时间(以毫秒为单位)。 不可为 null。 |
last_wait_type |
nvarchar(60) | 如果此请求先前已经阻塞,则此列返回上次等待的类型。 不可为 null。 |
wait_resource |
nvarchar(256) | 如果请求当前被阻塞,则此列返回请求当前等待的资源。 不可为 null。 |
open_transaction_count |
int | 为此请求打开的事务数。 不可为 null。 |
open_resultset_count |
int | 为此请求打开的结果集的个数。 不可为 null。 |
transaction_id |
bigint | 在其中执行此请求的事务的 ID。 不可为 null。 |
context_info |
varbinary(128) | CONTEXT_INFO 这场会议的价值。 可以为 NULL。 |
percent_complete |
real | 为以下命令完成的工作的百分比:ALTER INDEX REORGANIZEAUTO_SHRINK 选项 ALTER DATABASEBACKUP DATABASEDBCC CHECKDBDBCC CHECKFILEGROUPDBCC CHECKTABLEDBCC INDEXDEFRAGDBCC SHRINKDATABASEDBCC SHRINKFILERECOVERYRESTORE DATABASEROLLBACKTDE ENCRYPTION不可为 null。 |
estimated_completion_time |
bigint | 仅限内部。 不可为 null。 |
cpu_time |
int | 请求所使用的 CPU 时间(毫秒)。 不可为 null。 |
total_elapsed_time |
int | 请求到达后经过的总时间(毫秒)。 不可为 null。 |
scheduler_id |
int | 正在计划此请求的计划程序的 ID。 可以为 NULL。 |
task_address |
varbinary(8) | 分配给与此请求关联的任务的内存地址。 可以为 NULL。 |
reads |
bigint | 此请求执行的读取数。 不可为 null。 |
writes |
bigint | 此请求执行的写入数。 不可为 null。 |
logical_reads |
bigint | 此请求已经执行的逻辑读取数。 不可为 null。 |
text_size |
int | TEXTSIZE 请求的设置。 不可为 null。 |
language |
nvarchar(128) | 该请求的语言设置。 可以为 NULL。 |
date_format |
nvarchar(3) | DATEFORMAT 请求的设置。 可以为 NULL。 |
date_first |
smallint | DATEFIRST 请求的设置。 不可为 null。 |
quoted_identifier |
bit | 1 = QUOTED_IDENTIFIER 请求时开启。 否则返回 0。 不可为 null。 |
arithabort |
bit | 1 = ARITHABORT 请求时设置为 ON。 否则返回 0。 不可为 null。 |
ansi_null_dflt_on |
bit | 1 = ANSI_NULL_DFLT_ON 请求时设置为 ON。 否则返回 0。 不可为 null。 |
ansi_defaults |
bit | 1 = ANSI_DEFAULTS 请求时设置为 ON。 否则返回 0。 不可为 null。 |
ansi_warnings |
bit | 1 = ANSI_WARNINGS 请求时设置为 ON。 否则返回 0。 不可为 null。 |
ansi_padding |
bit | 1 = ANSI_PADDING 请求时设置为 ON。 否则返回 0。 不可为 null。 |
ansi_nulls |
bit | 1 = ANSI_NULLS 请求时设置为 ON。 否则返回 0。 不可为 null。 |
concat_null_yields_null |
bit | 1 = CONCAT_NULL_YIELDS_NULL 请求时设置为 ON。 否则返回 0。 不可为 null。 |
transaction_isolation_level |
smallint | 创建此请求的事务时使用的隔离级别。 不可为 null。 0 = 未指定 1 = 已读未承诺 2 = 已提交读取 3 = 可重复 4 = 可序列化 5 = 快照 |
lock_timeout |
int | 此请求的锁定超时时间(毫秒)。 不可为 null。 |
deadlock_priority |
int | DEADLOCK_PRIORITY 请求的设置。 不可为 null。 |
row_count |
bigint | 已由此请求返回到客户端的行数。 不可为 null。 |
prev_error |
int | 在执行请求期间发生的最后一个错误。 不可为 null。 |
nest_level |
int | 正在对请求执行的代码的嵌套级别。 不可为 null。 |
granted_query_memory |
int | 为执行该请求的查询而分配的页数。 不可为 null。 |
executing_managed_code |
bit | 指示特定请求当前是否正在执行公共语言运行时对象,例如例程、类型和触发器。 只要某个公共语言运行时对象在堆栈中,就会设置此值,甚至从公共语言运行时中运行 Transact-SQL 时,也会设置。 不可为 null。 |
group_id |
int | 此查询所属工作负荷组的 ID。 不可为 null。 |
query_hash |
binary(8) | 对查询计算的二进制哈希值,用于标识具有类似逻辑的查询。 可以使用查询哈希确定仅仅是文字值不同的查询的聚合资源使用情况。 |
query_plan_hash |
binary(8) | 对查询执行计划计算的二进制哈希值,用于标识类似的查询执行计划。 可以使用查询计划哈希查找具有类似执行计划的查询的累积成本。 |
statement_sql_handle |
varbinary(64) |
适用于:SQL Server 2014 (12.x) 及更高版本。sql_handle 的单个查询。如果数据库未启用查询存储,则此列为该列 NULL 。 |
statement_context_id |
bigint |
适用于:SQL Server 2014 (12.x) 及更高版本。 可选外键到 sys.query_context_settings.如果数据库未启用查询存储,则此列为该列 NULL 。 |
dop |
int |
适用于:SQL Server 2016 (13.x) 及更高版本。 查询的并行度 |
parallel_worker_count |
int |
适用于:SQL Server 2016 (13.x) 及更高版本。 如果这是并行查询,则为保留的并行辅助角色数。 |
external_script_request_id |
uniqueidentifier |
适用于:SQL Server 2016 (13.x) 及更高版本。 与当前请求关联的外部脚本请求 ID。 |
is_resumable |
bit | 适用于:SQL Server 2017 (14.x) 及更高版本。 指示请求是否为可恢复的索引操作。 |
page_resource |
binary(8) |
适用于:SQL Server 2019 (15.x) 如果 wait_resource 列包含页面,则为页面资源的 8 字节十六进制表示形式。 有关详细信息,请参阅 sys.fn_PageResCracker。 |
page_server_reads |
bigint | 适用范围:Azure SQL 数据库超大规模 此请求执行的页服务器读取数。 不可为 null。 |
dist_statement_id |
uniqueidentifier |
适用于:SQL Server 2022 及更高版本、Azure SQL 数据库、Azure SQL 托管实例、Azure Synapse Analytics(仅限无服务器池)和 Microsoft Fabric 所提交请求的语句的唯一 ID。 不可为 null。 |
注解
要执行在 SQL Server 以外的代码(例如,扩展存储过程和分布式查询),则必须在非抢先计划程序的控制范围以外执行该线程。 若要这样做,工作线程将切换到抢先模式。 由此动态管理视图返回的时间值不包括在抢先模式下花费的时间。
在行模式下执行并行请求时,SQL Server 将分配工作线程,来协调负责完成已向其分配的任务的工作线程。 在此 DMV 中,只有协调器线程对请求可见。 协调器线程的 reads、writes、logical_reads 和 row_count 列未更新。 仅更新协调器线程的 wait_type、wait_time、last_wait_type、wait_resource 和 granted_query_memory 列。 有关详细信息,请参阅 线程和任务体系结构指南。
该wait_resource列包含resource_description中类似的信息,但格式不同。
Permissions
如果用户对服务器具有 VIEW SERVER STATE 权限,则用户会看到 SQL Server 实例上执行的所有会话;否则,用户只看到当前会话。
VIEW SERVER STATE 不能在 Azure SQL 数据库中授予,因此 sys.dm_exec_requests 总是限制于当前连接。
在可用性组方案中,如果辅助副本设置为只读意向,则与辅助副本的连接必须通过添加applicationintent=readonly在连接字符串参数中指定其应用程序意向。 否则,即使存在权限,sys.dm_exec_requests访问检查VIEW SERVER STATE也不会为可用性组中的数据库传递。
对于 SQL Server 2022(16.x)及更高版本,sys.dm_exec_requests需要VIEW服务器上的 SERVER PERFORMANCE STATE 权限。
Examples
A. 查找正在运行的批处理的查询文本
以下示例查询 sys.dm_exec_requests 以查找感兴趣的查询并从输出复制其 sql_handle。
SELECT * FROM sys.dm_exec_requests;
GO
然后,为了获取语句文本,将复制的 sql_handle 与系统函数 sys.dm_exec_sql_text(sql_handle) 一起使用。
SELECT * FROM sys.dm_exec_sql_text(< copied sql_handle >);
GO
B。 显示活动请求
以下示例演示 SQL Server 数据仓库中当前运行的所有查询,不包括你自己的会话(@@SPID)。 它用于CROSS APPLYsys.dm_exec_sql_text检索每个请求的完整查询文本,并与之sys.dm_exec_sessions联接以包括用户任何主机信息。 该 session_id <> @@SPID 筛选器可确保在结果中看不到自己的查询。
SELECT r.session_id,
r.status,
r.command,
r.start_time,
r.total_elapsed_time / 1000.00 AS elapsed_seconds,
r.cpu_time / 1000.00 AS cpu_seconds,
r.reads,
r.writes,
r.logical_reads,
r.row_count,
s.login_name,
s.host_name,
t.text AS query_text
FROM sys.dm_exec_requests AS r
INNER JOIN sys.dm_exec_sessions AS s
ON r.session_id = s.session_id
CROSS APPLY sys.dm_exec_sql_text(r.sql_handle) AS t
WHERE r.session_id <> @@SPID
ORDER BY r.start_time DESC;
C。 查找正在运行的批处理持有的所有锁
以下示例查询 sys.dm_exec_requests 以查找感兴趣的批处理并从输出复制其 transaction_id。
SELECT * FROM sys.dm_exec_requests;
GO
然后,为了查找锁信息,将复制的 transaction_id 与系统函数 sys.dm_tran_locks 一起使用。
SELECT * FROM sys.dm_tran_locks
WHERE request_owner_type = N'TRANSACTION'
AND request_owner_id = < copied transaction_id >;
GO
D. 查找当前阻止的所有请求
以下示例查询 sys.dm_exec_requests 以查找有关被阻塞的请求的信息。
SELECT session_id,
status,
blocking_session_id,
wait_type,
wait_time,
wait_resource,
transaction_id
FROM sys.dm_exec_requests
WHERE status = N'suspended';
GO
E. 按 CPU 对现有请求进行排序
SELECT [req].[session_id],
[req].[start_time],
[req].[cpu_time] AS [cpu_time_ms],
OBJECT_NAME([ST].[objectid], [ST].[dbid]) AS [ObjectName],
SUBSTRING(
REPLACE(
REPLACE(
SUBSTRING(
[ST].[text], ([req].[statement_start_offset] / 2) + 1,
((CASE [req].[statement_end_offset]
WHEN -1 THEN DATALENGTH([ST].[text])
ELSE [req].[statement_end_offset]
END - [req].[statement_start_offset]
) / 2
) + 1
), CHAR(10), ' '
), CHAR(13), ' '
), 1, 512
) AS [statement_text]
FROM
[sys].[dm_exec_requests] AS [req]
CROSS APPLY [sys].dm_exec_sql_text([req].[sql_handle]) AS [ST]
ORDER BY
[req].[cpu_time] DESC;
GO
相关内容
- 系统动态管理视图与功能
- 与执行有关的动态管理视图和函数 (Transact-SQL)
- sys.dm_os_memory_clerks (Transact-SQL)
- sys.dm_os_sys_info(Transact-SQL)
- sys.dm_exec_query_memory_grants(Transact-SQL)
- sys.dm_exec_query_plan (Transact-SQL)
- sys.dm_exec_sql_text(Transact-SQL)
- SQL Server SQL Statistics 对象
- 查询处理体系结构指南
- 线程和任务体系结构指南
- 事务锁定和行版本控制指南
- 了解和解决 SQL Server 阻塞问题