SQL Server 系统表介绍:sys.dm_exec_requests

SQL Server动态管理视图:深入理解会话请求与性能监控
本文详细解析sys.dm_exec_requests视图,展示如何查询SQL Server中活跃会话的请求信息,包括查询文本、锁信息和阻塞情况,并介绍了相关示例和权限需求。

针对 SQL Server 内正在执行的每个请求返回一行。sys.dm_exec_connections、sys.dm_exec_sessionssys.dm_exec_requests 服务器范围动态管理视图映射到 sys.sysprocesses 系统视图(先前为系统表)。

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

列名数据类型说明
session_idsmallint与此请求相关的会话的 ID。不可为空值。
request_idint请求的 ID。在会话的上下文中是唯一的。不可为空值。
start_timedatetime计划运行请求的时间。不可为空值。
statusnvarchar(60)请求的状态。可能的值包括:
后台。请求是后台线程,例如资源监视器或死锁监视器。
正在运行。请求正在运行。
可运行。请求正在运行,由于仲裁不足,因此要临时进行妥善安排。
睡眠。没有要做的工作。
挂起。请求正在等待工作线程选取。
已挂起。请求正在等待某个事件。
不可为空值。
commandnvarchar(32)标识正在处理的命令的类型。常用命令类型包括:
SELECT
INSERT
UPDATE
DELETE
BACKUP LOG
BACKUP DB
DBCC
WAITFOR
通过结合使用 sys.dm_exec_sql_text 动态管理函数和请求的相应 sql_handle,可以检索该请求的文本。内部系统进程将基于它们所执行的任务类型来设置该命令。这些任务可以包括:
LOCK MONITOR
CHECKPOINTLAZY
WRITER
不可为空值。
sql_handlevarbinary(64)请求的 SQL 语句句柄。该句柄可用于通过sys.dm_exec_sql_text 动态管理函数检索实际语句文本。不可为空值。
statement_start_offsetint执行批处理或存储过程中的执行语句的开始字符位置。可以与statement_end_offset、sys.dm_exec_sql_text 动态管理函数和 sql_handle 一起使用,为请求检索正在执行的语句。可为空值。
statement_end_offsetint执行批处理或存储过程中正在执行的语句的结束字符位置。可以与statement_start_offset、sys.dm_exec_sql_text 动态管理函数和 sql_handle 一起使用,为请求检索正在执行的语句。可为空值。
plan_handlevarbinary(64)请求的查询计划句柄。若要查看查询计划,请结合使用sys.dm_exec_query_plan 动态管理函数。若要查询计划缓存,请使用 sys.dm_exec_cached_plans 动态管理视图。若要查看计划属性,请使用 sys.dm_exec_plan_attributes 函数。可为空值。
database_idsmallint正在运行请求的数据库的 ID。有关详细的数据库信息,请查询sys.databases 目录视图;或者,若要获得数据库名称,请使用db_name() 内部函数。不可为空值。
user_idint正在运行请求的用户 ID。有关详细的用户信息,请查询sys.database_principals 目录视图。不可为空值。
connection_iduniqueidentifier请求到达时所采用的连接的 ID。有关物理或逻辑连接的详细信息,请查询 sys.dm_exec_connections 动态管理视图。可为空值。
blocking_session_idsmallint正在阻塞请求的会话的 ID。如果此列为 0,则表示请求未被阻塞,或者锁定会话的信息不可用或无法进行标识。
-2 = 阻塞资源由孤立的分布式事务拥有。
-3 = 阻塞资源由延迟的恢复事务拥有。
-4 = 由于内部闩锁状态转换而无法确定阻塞闩锁所有者的会话 ID。
wait_typenvarchar(60)如果请求被阻塞,则此列返回等待类型。可为空值。
wait_timeint如果请求被阻塞,则此列返回当前等待的持续时间(毫秒)。不可为空值。
last_wait_typenvarchar(64)如果此请求先前已经阻塞,则此列返回上次等待的类型。不可为空值。
wait_resourcenvarchar(512)如果请求被阻塞,则此列返回正在等待请求的资源。不可为空值。
open_transaction_countint为此请求打开的事务数。不可为空值。
open_resultset_countint为此请求打开的结果集的个数。不可为空值。
transaction_idbigint在其中执行此请求的事务的 ID。对于 SQL Server 实例,该 ID 是唯一的。用来查询sys.dm_tran_active_transactions、sys.dm_tran_locks或 sys.dm_tran_database_transactions 动态管理视图。不可为空值。
context_infovarbinary(128)请求的 SET CONTEXT_INFO 语句的值。可为空值。
percent_completereal为某些操作(包括回滚)完成的工作的百分比。
此操作不提供查询的进度数据。
注意:
不可为空值。
estimated_completion_timebigint仅供内部使用。不可为空值。
cpu_timeint请求所使用的 CPU 时间(毫秒)。不可为空值。
total_elapsed_timeint请求到达后经过的总时间(毫秒)。不可为空值。
scheduler_idint正在计划此请求的计划程序的 ID。有关此计划程序的详细信息,请查询 sys.dm_os_schedulers 动态管理视图。不可为空值。
task_addressvarbinary(8)分配给与此请求关联的任务的内存地址。有关此任务的详细信息,请查询 sys.dm_os_tasks 动态管理视图。可为空值。
readsbigint此请求执行的读取数。不可为空值。
Writesbigint此请求执行的写入数。不可为空值。
logical_readsbigint此请求已经执行的逻辑读取数。不可为空值。
text_sizeint此请求的 TEXTSIZE 设置。不可为空值。
languagenvarchar(256)该请求的语言设置。可为空值。
date_formatnvarchar(3)该请求的 DATEFORMAT 设置。可为空值。
date_firstsmallint该请求的 DATEFIRST 设置。不可为空值。
quoted_identifierbit1 = QUOTED_IDENTIFIER 对于该请求是 ON。否则为 0。
不可为空值。
arithabortbit1 = ARITHABORT 设置对于该请求是 ON。否则为 0。
不可为空值。
ansi_null_dflt_onbit1 = ANSI_NULL_DFLT_ON 设置对于该请求是 ON。否则为 0。
不可为空值。
ansi_defaultsbit1 = ANSI_DEFAULTS 设置对于该请求是 ON。否则为 0。
不可为空值。
ansi_warningsbit1 = ANSI_WARNINGS 设置对于该请求是 ON。否则为 0。
不可为空值。
ansi_paddingbit1 = ANSI_PADDING 设置对于该请求是 ON。
否则为 0。
不可为空值。
ansi_nullsbit1 = ANSI_NULLS 设置对于该请求是 ON。否则为 0。
不可为空值。
concat_null_yields_nullbit1 = CONCAT_NULL_YIELDS_NULL 设置对于该请求是 ON。否则为 0。
不可为空值。
transaction_isolation_levelsmallint此请求的事务隔离级别。可能的值包括:
0 = 未指定
1 = 未提交读取
2 = 已提交读取
3 = 可重复
4 = 可序列化
5 = 快照
不可为空值。
lock_timeoutint此请求的锁超时时间(毫秒)。不可为空值。
deadlock_priorityint请求的 DEADLOCK_PRIORITY 设置。不可为空值。
row_countbigint已由此请求返回到客户端的行数。不可为空值。
prev_errorint在执行请求期间发生的最后一个错误。不可为空值。
nest_levelint正在对该请求执行的代码的嵌套级别。不可为空值。
granted_query_memoryint为执行该请求的查询而分配的页数。不可为空值。
executing_managed_codebit指示此请求是否正在执行公共语言运行时对象,例如例程、类型和触发器。只要公共语言运行时对象在堆栈中,就会设置此值,甚至在从公共语言运行时运行 Transact-SQL 时,也会设置。不可为空值。

权限

需要对服务器具有 VIEW SERVER STATE 权限。

如果用户拥有对服务器的 VIEW SERVER STATE 权限,用户将会查看 SQL Server 实例上的所有正在执行的会话;否则,用户将只会查看执行 sys.dm_exec_requests 的会话。

关系基数

对于/应用关系
sys.dm_exec_sessionssys.dm_exec_requestssession_id一对
零或一对多
sys.dm_exec_requestssys.dm_exec_sql_text(sql_handle)CROSS APPLY零或一对
OUTER APPLY零或一
sys.dm_exec_requestssys.dm_exec_query_plan(plan_handle)CROSS APPLY零或一对
OUTER APPLY零或一
sys.dm_exec_requestssys.dm_exec_cached_plansplan_handle零或一对
零或一
sys.dm_exec_requestssys.dm_exec_plan_attributes(plan_handle)CROSS APPLY零或一对
OUTER APPLY零或一
sys.dm_exec_requestssys.databasesdatabase_id一对一
sys.dm_exec_requestssys.database_principalsuser_id =principal_id一对一
sys.dm_exec_connectionssys.dm_exec_requestsconnection_id一对
零或一
sys.dm_exec_requestssys.dm_tran_active_transactionstransaction_id一对一

示例

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
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值