sys.dm_exec_requests (Transact-SQL)

适用于:SQL ServerAzure SQL 数据库Azure SQL 托管实例Azure Synapse AnalyticsAnalytics Platform System (PDW)Microsoft Fabric 中的 SQL 分析终结点Microsoft Fabric 中的仓库

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

注意

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

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

background
rollback
“正在运行”
可运行
正在睡眠
已挂起

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

SELECT
INSERT
UPDATE
DELETE
BACKUP LOG
BACKUP DATABASE
DBCC
FOR

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

LOCK MONITOR
CHECKPOINTLAZY
WRITER

不可为 Null。
sql_handle varbinary(64) 是唯一标识查询所属的批处理或存储过程的令牌。 Nullable。
statement_start_offset int 以字节为单位表示当前正在执行的批处理或持久化对象的当前正在执行的语句的起始位置,从 0 开始。 可以与 sql_handlestatement_end_offsetsys.dm_exec_sql_text 动态管理函数一起使用,以便为请求检索当前正在执行的语句。 Nullable。
statement_end_offset int 以字节为单位表示当前正在执行的批处理或持久化对象的当前正在执行的语句的结束位置,从 0 开始。 可以与 sql_handlestatement_start_offsetsys.dm_exec_sql_text 动态管理函数一起使用,以便为请求检索当前正在执行的语句。 Nullable。
plan_handle varbinary(64) 是唯一标识当前正在执行的批处理的查询执行计划的令牌。 Nullable。
database_id smallint 对其执行请求的数据库的 ID。 不可为 Null。

在 Azure SQL 数据库中,这些值在单一数据库或弹性池中是唯一的,但在逻辑服务器中不是唯一的。
user_id int 提交请求的用户的 ID。 不可为 Null。
connection_id uniqueidentifier 请求到达时所采用的连接的 ID。 Nullable。
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) 如果请求当前被阻塞,则此列返回等待类型。 Nullable。

有关等待类型的信息,请参阅
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 值。 Nullable。
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。 Nullable。
task_address varbinary(8) 分配给与此请求关联的任务的内存地址。 Nullable。
reads bigint 此请求执行的读取数。 不可为 Null。
writes bigint 此请求执行的写入数。 不可为 Null。
logical_reads bigint 此请求已经执行的逻辑读取数。 不可为 Null。
text_size int 此请求的 TEXTSIZE 设置。 不可为 Null。
language nvarchar(128) 该请求的语言设置。 Nullable。
date_format nvarchar(3) 该请求的 DATEFORMAT 设置。 Nullable。
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_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 中,只有协调器线程对请求可见。 协调器线程的 readswriteslogical_readsrow_count 列未更新。 仅更新协调器线程的 wait_typewait_timelast_wait_typewait_resourcegranted_query_memory。 有关详细信息,请参阅线程和任务体系结构指南

wait_resource列包含与 sys.dm_tran_locks(Transact-SQL)中的类似信息resource_description但格式不同。

权限

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

在可用性组方案中,如果辅助副本 (replica)设置为只读意向,则与辅助数据库的连接必须通过添加applicationintent=readonly连接字符串参数来指定其应用程序意向。 否则,即使存在权限,VIEW SERVER STATE访问sys.dm_exec_requests检查也不会为可用性组中的数据库传递。

对于 SQL Server 2022(16.x)及更高版本,sys.dm_exec_requests需要对服务器具有 VIEW 标准版RVER PERFORMANCE STATE 权限。

示例

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],
    [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