SQL Server查询会话、锁、杀会话

0    201    1

Tags:

👉 本文共约40260个字,系统预计阅读时间或需152分钟。

sys.dm_exec_sessions

返回SQL Server上每个经过身份验证的会话一行。 sys.dm_exec_sessions 是一个服务器范围视图,显示有关所有活动用户连接和内部任务的信息。 此信息包含客户端版本、客户端程序名称、客户端登录时间、登录用户、当前会话设置等。 使用 sys.dm_exec_sessions 可首先查看当前系统负载并确定感兴趣的会话,然后使用其他动态管理视图或动态管理功能了解有关该会话的详细信息。

、 和 动态管理视图映射到已弃用的 sys.sysprocesses 系统兼容性视图。sys.dm_exec_requestssys.dm_exec_sessionssys.dm_exec_connections

备注

若要从 Azure Synapse Analytics 或 Analytics Platform System (PDW) 中的专用 SQL 池调用此池,请参阅 sys.dm_pdw_nodes_exec_sessions。 对于无服务器 SQL 池,请使用 sys.dm_exec_sessions

列名称数据类型说明和特定于版本的信息
session_idsmallint标识与每个活动主连接关联的会话。 不可为 Null。
login_timedatetime建立会话的时间。 不可为 Null。 在查询此 DMV 时,显示尚未完成登录的会话,登录时间为 1900-01-01
host_namenvarchar(128)特定于会话的客户端工作站名称。 对于内部会话,该值为 NULL。 可以为 Null。 安全说明: 客户端应用程序提供工作站名称,并可能提供不准确的数据。 不要依赖HOST_NAME作为安全功能。
program_namenvarchar(128)启动会话的客户端程序的名称。 对于内部会话,该值为 NULL。 可以为 Null。
host_process_idint启动会话的客户端程序的进程 ID。 对于内部会话,该值为 NULL。 可以为 Null。
client_versionint客户端连接到服务器所用接口的 TDS 协议版本。 对于内部会话,该值为 NULL。 可以为 Null。
client_interface_namenvarchar(32)客户端用于与服务器通信的库/驱动程序的名称。 对于内部会话,该值为 NULL。 可以为 Null。
security_idvarbinary(85)与登录名关联的 Microsoft Windows 安全 ID。 不可为 Null。
login_namenvarchar(128)当前执行的会话所使用的 SQL Server 登录名。 有关创建此会话的原始登录名,请参阅 original_login_name。 可以是SQL Server经过身份验证的登录名,也可以是经过 Windows 身份验证的域用户名。 不可为 Null。
nt_domainnvarchar(128)适用于:SQL Server 2008 (10.0.x) 及更高版本 客户端的 Windows 域(如果使用 Windows 身份验证或可信连接进行会话)。 对于内部会话和非域用户,该值为 NULL。 可以为 Null。
nt_user_namenvarchar(128)适用于:SQL Server 2008 (10.0.x) 及更高版本 客户端的 Windows 用户名(如果使用 Windows 身份验证或可信连接进行会话)。 对于内部会话和非域用户,该值为 NULL。 可以为 Null。
statusnvarchar(30)会话的状态。 可能的值: Running - 当前正在运行一个或多个请求 Sleeping - 当前没有运行任何请求 休眠 - 由于连接池,会话已重置,现在处于预登录状态。 Preconnect - 会话在资源调控器分类器中。 不可为 Null。
context_infovarbinary(128)会话的 CONTEXT_INFO 值。 上下文信息由用户使用 SET CONTEXT_INFO 语句设置。 可以为 Null。
cpu_timeint此会话使用的 CPU 时间(以毫秒为单位)。 不可为 Null。
memory_usageint该会话所占用的 8 KB 内存页数。 不可为 Null。
total_scheduled_timeint计划内含请求的会话的执行所耗用的总计时间(毫秒)。 不可为 Null。
total_elapsed_timeint自会话建立以来已耗用的时间(毫秒)。 不可为 Null。
endpoint_idint与会话关联的端点的 ID。 不可为 Null。
last_request_start_timedatetime最近一次会话请求的开始时间。 这包括当前正在执行的请求。 不可为 Null。
last_request_end_timedatetime最近一次会话请求的完成时间。 可以为 Null。
readsbigint在该会话期间该会话中的请求所执行的读取次数。 不可为 Null。
Writesbigint在该会话期间该会话中的请求所执行的写入次数。 不可为 Null。
logical_readsbigint在此会话期间,此会话中的请求执行的逻辑读取数。 不可为 Null。
is_user_processbit如果会话是系统会话,则为 0。 否则为 1。 不可为 Null。
text_sizeint会话的 TEXTSIZE 设置。 不可为 Null。
语言nvarchar(128)会话的 LANGUAGE 设置。 可以为 Null。
date_formatnvarchar(3)会话的 DATEFORMAT 设置。 可以为 Null。
date_firstsmallint会话的 DATEFIRST 设置。 不可为 Null。
quoted_identifierbit会话的 QUOTED_IDENTIFIER 设置。 不可为 Null。
arithabortbit会话的 ARITHABORT 设置。 不可为 Null。
ansi_null_dflt_onbit会话的 ANSI_NULL_DFLT_ON 设置。 不可为 Null。
ansi_defaultsbit会话的 ANSI_DEFAULTS 设置。 不可为 Null。
ansi_warningsbit会话的 ANSI_WARNINGS 设置。 不可为 Null。
ansi_paddingbit会话的 ANSI_PADDING 设置。 不可为 Null。
ansi_nullsbit会话的 ANSI_NULLS 设置。 不可为 Null。
concat_null_yields_nullbit会话的 CONCAT_NULL_YIELDS_NULL 设置。 不可为 Null。
transaction_isolation_levelsmallint会话的事务隔离级别。 0 = 未指定 1 = ReadUncommitted 2 = 已提交读取 3 = RepeatableRead 4 = 可序列化 5 = 快照 不可为 Null。
lock_timeoutint会话的 LOCK_TIMEOUT 设置。 该值以毫秒计。 不可为 Null。
deadlock_priorityint会话的 DEADLOCK_PRIORITY 设置。 不可为 Null。
row_countbigint到目前为止会话返回的行数。 不可为 Null。
prev_errorint会话返回的最近一个错误的 ID。 不可为 Null。
original_security_idvarbinary(85)与original_login_name关联的 Microsoft Windows 安全 ID。 不可为 Null。
original_login_namenvarchar(128)SQL Server客户端用于创建此会话的登录名。 可以是SQL Server经过身份验证的登录名、经过 Windows 身份验证的域用户名或包含的数据库用户。 在初始连接后,会话可能经过许多隐式或显式上下文切换。 例如,如果使用 EXECUTE AS 。 不可为 Null。
last_successful_logondatetime适用于:SQL Server 2008 (10.0.x) 及更高版本 当前会话开始前 original_login_name 上一次成功登录的时间。
last_unsuccessful_logondatetime适用于:SQL Server 2008 (10.0.x) 及更高版本 当前会话开始前,original_login_name 上一次登录失败的时间。
unsuccessful_logonsbigint适用于:SQL Server 2008 (10.0.x) 及更高版本 在 last_successful_logon 和 login_time 之间 original_login_name 的登录失败次数。
group_idint此会话所属工作负荷组的 ID。 不可为 Null。
database_idsmallint适用于:SQL Server 2012 (11.x) 及更高版本 每个会话的当前数据库的 ID。
authenticating_database_idint适用于:SQL Server 2012 (11.x) 及更高版本 对主体进行身份验证的数据库的 ID。 对于登录名,该值将为 0。 对于包含数据库用户,该值将为包含数据库的数据库 ID。
open_transaction_countint适用于:SQL Server 2012 (11.x) 及更高版本 每个会话的打开事务数。
pdw_node_idint适用于:Azure Synapse Analytics、Analytics Platform System (PDW) 此分发所在节点的标识符。
page_server_readsbigint适用范围:Azure SQL 数据库超大规模 在此会话期间,此会话中的请求执行的页服务器读取数。 不可为 Null。

权限

每个人都可以查看自己的会话信息。

SQL Server:需要VIEW SERVER STATESQL Server权限才能查看服务器上的所有会话。

SQL 数据库:需要VIEW DATABASE STATE查看与当前数据库的所有连接。 VIEW DATABASE STATE 无法在数据库中授予 master

备注

启用 通用条件符合性启用 服务器配置选项后,登录统计信息将显示在以下列中。

  • last_successful_logon
  • last_unsuccessful_logon
  • unsuccessful_logons

如果未启用此选项,这些列将返回 null 值。 有关如何设置此服务器配置选项的详细信息,请参阅 通用条件符合性已启用服务器配置选项

Azure SQL 数据库上的管理员连接将看到每个经过身份验证的会话一行。 结果集中显示的“sa”会话对会话的用户配额没有任何影响。 非管理员连接将仅看到与其数据库用户会话相关的信息。

关系基数

功能对于/应用关系
sys.dm_exec_sessionssys.dm_exec_requestssession_id一对零或一对多
sys.dm_exec_sessionssys.dm_exec_connectionssession_id一对零或一对多
sys.dm_exec_sessionssys.dm_tran_session_transactionssession_id一对零或一对多
sys.dm_exec_sessionssys.dm_exec_cursors (session_id |0)session_id CROSS APPLY OUTER APPLY一对零或一对多
sys.dm_exec_sessionssys.dm_db_session_space_usagesession_id一对一

示例

A. 查找连接到服务器的用户

下例将查找连接到服务器的用户并返回每个用户的会话数。

B. 查找长时间运行的游标

下例将查找打开时间超过指定时间段的游标、创建游标的用户以及游标所在的会话。

C. 查找具有打开事务的空闲会话

下例将查找具有已打开事务的空闲会话。 空闲会话是当前未运行请求的会话。

D. 查找有关查询自己的连接的信息

以下示例收集有关查询自己的连接的信息:

sys.dm_exec_requests

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

备注

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

列名称数据类型说明
session_idsmallint与此请求相关的会话的 ID。 不可为 null。
request_idint请求的 ID。 在会话的上下文中是唯一的。 不可为 null。
start_timedatetime请求到达时的时间戳。 不可为 null。
statusnvarchar(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_handlevarbinary(64)是唯一标识查询所属的批处理或存储过程的令牌。 可以为 Null。
statement_start_offsetint以字节为单位表示当前正在执行的批处理或持久化对象的当前正在执行的语句的起始位置,从 0 开始。 可以与 sql_handlestatement_end_offsetsys.dm_exec_sql_text 动态管理函数一起使用,以便为请求检索当前正在执行的语句。 可以为 Null。
statement_end_offsetint以字节为单位表示当前正在执行的批处理或持久化对象的当前正在执行的语句的结束位置,从 0 开始。 可以与 sql_handlestatement_start_offsetsys.dm_exec_sql_text 动态管理函数一起使用,以便为请求检索当前正在执行的语句。 可以为 Null。
plan_handlevarbinary(64)是唯一标识当前正在执行的批处理的查询执行计划的令牌。 可以为 Null。
database_idsmallint对其执行请求的数据库的 ID。 不可为 null。
user_idint提交请求的用户的 ID。 不可为 null。
connection_iduniqueidentifier请求到达时所采用的连接的 ID。 可以为 Null。
blocking_session_idsmallint正在阻塞请求的会话的 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_typenvarchar(60)如果请求当前被阻塞,则此列返回等待类型。 可以为 Null。 有关等待类型的信息,请参阅 。
wait_timeint如果请求当前被阻塞,则此列返回当前等待的持续时间(以毫秒为单位)。 不可为 null。
last_wait_typenvarchar(60)如果此请求先前已经阻塞,则此列返回上次等待的类型。 不可为 null。
wait_resourcenvarchar(256)如果请求当前被阻塞,则此列返回请求当前等待的资源。 不可为 null。
open_transaction_countint为此请求打开的事务数。 不可为 null。
open_resultset_countint为此请求打开的结果集的个数。 不可为 null。
transaction_idbigint在其中执行此请求的事务的 ID。 不可为 null。
context_infovarbinary(128)会话的 CONTEXT_INFO 值。 可以为 Null。
percent_completereal为以下命令完成的工作的百分比: 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_timebigint仅限内部。 不可为 null。
cpu_timeint请求所使用的 CPU 时间(毫秒)。 不可为 null。
total_elapsed_timeint请求到达后经过的总时间(毫秒)。 不可为 null。
scheduler_idint正在计划此请求的计划程序的 ID。 可以为 Null。
task_addressvarbinary(8)分配给与此请求关联的任务的内存地址。 可以为 Null。
readsbigint此请求执行的读取数。 不可为 null。
Writesbigint此请求执行的写入数。 不可为 null。
logical_readsbigint此请求已经执行的逻辑读取数。 不可为 null。
text_sizeint此请求的 TEXTSIZE 设置。 不可为 null。
语言nvarchar(128)该请求的语言设置。 可以为 Null。
date_formatnvarchar(3)该请求的 DATEFORMAT 设置。 可以为 Null。
date_firstsmallint该请求的 DATEFIRST 设置。 不可为 null。
quoted_identifierbit1 = QUOTED_IDENTIFIER 对于该请求是 ON。 否则返回 0。 不可为 null。
arithabortbit1 = ARITHABORT 设置对于该请求是 ON。 否则返回 0。 不可为 null。
ansi_null_dflt_onbit1 = ANSI_NULL_DFLT_ON 设置对于该请求是 ON。 否则返回 0。 不可为 null。
ansi_defaultsbit1 = ANSI_DEFAULTS 设置对于该请求是 ON。 否则返回 0。 不可为 null。
ansi_warningsbit1 = ANSI_WARNINGS 设置对于该请求是 ON。 否则返回 0。 不可为 null。
ansi_paddingbit1 = ANSI_PADDING 设置对于该请求是 ON。 否则返回 0。 不可为 null。
ansi_nullsbit1 = ANSI_NULLS 设置对于该请求是 ON。 否则返回 0。 不可为 null。
concat_null_yields_nullbit1 = CONCAT_NULL_YIELDS_NULL 设置对于该请求是 ON。 否则返回 0。 不可为 null。
transaction_isolation_levelsmallint创建此请求的事务时使用的隔离级别。 不可为 null。 0 = 未指定 1 = 未提交读取 2 = 已提交读取 3 = 可重复 4 = 可序列化 5 = 快照
lock_timeoutint此请求的锁定超时时间(毫秒)。 不可为 null。
deadlock_priorityint请求的 DEADLOCK_PRIORITY 设置。 不可为 null。
row_countbigint已由此请求返回到客户端的行数。 不可为 null。
prev_errorint在执行请求期间发生的最后一个错误。 不可为 null。
nest_levelint正在对请求执行的代码的嵌套级别。 不可为 null。
granted_query_memoryint为执行该请求的查询而分配的页数。 不可为 null。
executing_managed_codebit指示特定请求当前是否正在执行公共语言运行时对象,例如例程、类型和触发器。 只要某个公共语言运行时对象在堆栈中,就会设置此值,甚至从公共语言运行时中运行 Transact-SQL 时,也会设置。 不可为 null。
group_idint此查询所属工作负荷组的 ID。 不可为 null。
query_hashbinary(8)对查询计算的二进制哈希值,用于标识具有类似逻辑的查询。 可以使用查询哈希确定仅仅是文字值不同的查询的聚合资源使用情况。
query_plan_hashbinary(8)对查询执行计划计算的二进制哈希值,用于标识类似的查询执行计划。 可以使用查询计划哈希查找具有类似执行计划的查询的累积成本。
statement_sql_handlevarbinary(64)适用于:SQL Server 2014 (12.x) 及更高版本。 单个查询的 SQL 句柄。 如果数据库未启用查询存储,则此列为 NULL。
statement_context_idbigint适用于:SQL Server 2014 (12.x) 及更高版本。 sys.query_context_settings 的可选外键。 如果数据库未启用查询存储,则此列为 NULL。
dopint适用于:SQL Server 2016 (13.x) 及更高版本。 查询的并行度
parallel_worker_countint适用于:SQL Server 2016 (13.x) 及更高版本。 如果这是并行查询,则为保留的并行辅助角色数。
external_script_request_iduniqueidentifier适用于:SQL Server 2016 (13.x) 及更高版本。 与当前请求关联的外部脚本请求 ID。
is_resumablebit适用于:SQL Server 2017 (14.x) 及更高版本。 指示请求是否为可恢复的索引操作。
page_resourcebinary(8)适用于:SQL Server 2019 (15.x) 如果 wait_resource 列包含页面,则为页面资源的 8 字节十六进制表示形式。 有关详细信息,请参阅 sys.fn_PageResCracker
page_server_readsbigint适用范围: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

然后,为了获取语句文本,将复制的 sql_handle 与系统函数 sys.dm_exec_sql_text(sql_handle) 一起使用。

B. 查找运行的批处理持有的所有锁

以下示例查询 sys.dm_exec_requests 以查找感兴趣的批处理并从输出复制其 transaction_id

然后,为了查找锁信息,将复制的 transaction_id 与系统函数 sys.dm_tran_locks 一起使用。

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

以下示例查询 sys.dm_exec_requests 以查找有关被阻塞的请求的信息。

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

sys.sysprocesses

包含有关在 SQL Server 实例上运行的进程的信息。 这些进程可以是客户端进程或系统进程。 若要访问 sysprocesses,您必须位于 master 数据库上下文中,或者必须使用由三部分构成的名称 master.dbo.sysprocesses。

重要

本人提供Oracle(OCP、OCM)、MySQL(OCP)、PostgreSQL(PGCA、PGCE、PGCM)等数据库的培训和考证业务,私聊QQ646634621或微信dbaup66,谢谢!
AiDBA后续精彩内容已被站长无情隐藏,请输入验证码解锁本文!
验证码:
获取验证码: 请先关注本站微信公众号,然后回复“验证码”,获取验证码。在微信里搜索“AiDBA”或者“dbaup6”或者微信扫描右侧二维码都可以关注本站微信公众号。

标签:

Avatar photo

小麦苗

学习或考证,均可联系麦老师,请加微信db_bao或QQ646634621

您可能还喜欢...

发表回复