sys.dm_exec_requests (Transact-SQL)

适用于:SQL Server (所有受支持的版本) Azure SQL数据库Azure Synapse分析

返回有关在 SQL Server 中正在执行的每个请求的信息。 有关请求的详细信息,请参阅线程和任务体系结构指南

注意

要从 Azure Synapse Analytics 或 Analytics Platform System (PDW) 中的专用 SQL 池中调用它,请参阅 sys.dm_pdw_exec_requests (Transact-SQL)。 对于无服务器 SQL 池,请使用 sys.dm_exec_requests

列名称 数据类型 说明
session_id smallint 与此请求相关的会话的 ID。 不可为 null。
request_id int 请求的 ID。 在会话的上下文中是唯一的。 不可为 null。
start_time datetime 请求到达时的时间戳。 不可为 null。
status nvarchar(30) 请求的状态。 可以是以下其中一个值:

背景
正在运行
可运行
Sleeping
Suspended

不可为 null。
命令 nvarchar(32) 标识正在处理的命令的当前类型。 常用命令类型包括以下值:

SELECT
INSERT
UPDATE
DELETE
BACKUP LOG
BACKUP DATABASE
DBCC
FOR

可通过结合使用 sys.dm_exec_sql_text 和与请求对应的 sql_handle 检索请求的文本。 内部系统进程将基于它们所执行任务的类型来设置该命令。 这些任务可以包括以下值:

LOCK MONITOR
CHECKPOINTLAZY
WRITER

不可为 null。
sql_handle varbinary(64) 是唯一标识查询所属的批处理或存储过程的令牌。 可以为 Null。
statement_start_offset int 以字节为单位表示当前正在执行的批处理或持久化对象的当前正在执行的语句的起始位置,从 0 开始。 可以与 sql_handlestatement_end_offsetsys.dm_exec_sql_text 动态管理函数一起使用,以便为请求检索当前正在执行的语句。 可以为 Null。
statement_end_offset int 以字节为单位表示当前正在执行的批处理或持久化对象的当前正在执行的语句的结束位置,从 0 开始。 可以与 sql_handlestatement_start_offsetsys.dm_exec_sql_text 动态管理函数一起使用,以便为请求检索当前正在执行的语句。 可以为 Null。
plan_handle varbinary(64) 是唯一标识当前正在执行的批处理的查询执行计划的令牌。 可以为 Null。
database_id smallint 对其执行请求的数据库的 ID。 不可为 null。
user_id int 提交请求的用户的 ID。 不可为 null。
connection_id uniqueidentifier 请求到达时所采用的连接的 ID。 可以为 Null。
blocking_session_id smallint 正在阻塞请求的会话的 ID。 如果此列为 NULL 或等于 0,则表示请求未被阻塞,或阻塞会话的会话信息不可用(或无法进行标识)。 有关详细信息,请参阅了解并解决 SQL Server 阻塞问题

-2 = 阻塞资源由孤立的分布式事务拥有。

-3 = 阻塞资源由延迟的恢复事务拥有。

-4 = 由于内部闩锁状态转换而导致此时无法确定阻塞闩锁所有者的会话 ID。

-5 = 无法确定阻塞闩锁所有者的会话 ID,因为无法跟踪此闩锁类型 (例如 SH 闩锁) 。

就其本身而言,blocking_session_id -5 不会指示性能问题。 -5 指示会话正在等待异步操作完成。 在引入 -5 之前,同一会话已显示 blocking_session_id 0,尽管它仍处于等待状态。

根据工作负载,观察 -5 作为 blocking_session_id 的情况可能很常见。
wait_type nvarchar(60) 如果请求当前被阻塞,则此列返回等待类型。 可以为 Null。

有关等待类型的信息,请参阅
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 REORGANIZE
AUTO_SHRINK 选项(带 ALTER DATABASE)
BACKUP DATABASE
DBCC CHECKDB
DBCC CHECKFILEGROUP
DBCC CHECKTABLE
DBCC INDEXDEFRAG
DBCC SHRINKDATABASE
DBCC SHRINKFILE
RECOVERY
RESTORE DATABASE
ROLLBACK
TDE 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。
语言 nvarchar(128) 该请求的语言设置。 可以为 Null。
date_format nvarchar(3) 该请求的 DATEFORMAT 设置。 可以为 Null。
date_first smallint 该请求的 DATEFIRST 设置。 不可为 null。
quoted_identifier bit 1 = QUOTED_IDENTIFIER 对于该请求是 ON。 否则返回 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 句柄。

如果数据库未启用查询存储,则此列为 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。

备注

要执行在 SQL Server 以外的代码(例如,扩展存储过程和分布式查询),则必须在非抢先计划程序的控制范围以外执行该线程。 若要这样做,工作线程将切换到抢先模式。 由此动态管理视图返回的时间值不包括在抢先模式下花费的时间。

行模式下执行并行请求时,SQL Server 将分配工作线程,来协调负责完成已向其分配的任务的工作线程。 在此 DMV 中,只有协调器线程对请求可见。 协调器线程的 readswriteslogical_readsrow_count 列未更新。 仅更新协调器线程的 wait_typewait_timelast_wait_typewait_resourcegranted_query_memory 列。 有关详细信息,请参阅线程和任务体系结构指南

权限

如果用户对服务器具有 VIEW SERVER STATE 权限,则该用户可以查看 SQL Server 实例上所有正在执行的会话;否则,该用户只能查看当前会话。 VIEW SERVER STATE 不能在 Azure SQL 数据库中授予,因此 sys.dm_exec_requests 总是限制于当前连接。

在 Always-On 方案中,如果次要副本设置为“仅读意向”,则与次要副本的连接必须通过添加 applicationintent=readonly 在连接字符串参数中指定其应用程序意向。 否则,即使存在 VIEW SERVER STATE 权限,对可用性组中的数据库的 sys.dm_exec_requests 访问检查也不会通过。

示例

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. 查找运行的批处理持有的所有锁

以下示例查询 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  

C. 查找当前阻塞的所有请求

以下示例查询 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  

D. 按 CPU 对现有请求进行排序

SELECT 
   req.session_id
   , req.start_time
   , cpu_time 'cpu_time_ms'
   , object_name(st.objectid,st.dbid) 'ObjectName' 
   , substring
      (REPLACE
        (REPLACE
          (SUBSTRING
            (ST.text
            , (req.statement_start_offset/2) + 1
            , (
               (CASE 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 cpu_time desc;
GO

另请参阅

后续步骤