合 SQL Server查询会话、锁、杀会话
Tags: MSSQLSQL Server杀会话会话信息查会话
sys.dm_exec_sessions
返回SQL Server上每个经过身份验证的会话一行。 sys.dm_exec_sessions
是一个服务器范围视图,显示有关所有活动用户连接和内部任务的信息。 此信息包含客户端版本、客户端程序名称、客户端登录时间、登录用户、当前会话设置等。 使用 sys.dm_exec_sessions
可首先查看当前系统负载并确定感兴趣的会话,然后使用其他动态管理视图或动态管理功能了解有关该会话的详细信息。
、 和 动态管理视图映射到已弃用的 sys.sysprocesses 系统兼容性视图。sys.dm_exec_requests
sys.dm_exec_sessions
sys.dm_exec_connections
备注
若要从 Azure Synapse Analytics 或 Analytics Platform System (PDW) 中的专用 SQL 池调用此池,请参阅 sys.dm_pdw_nodes_exec_sessions。 对于无服务器 SQL 池,请使用 sys.dm_exec_sessions
。
列名称 | 数据类型 | 说明和特定于版本的信息 |
---|---|---|
session_id | smallint | 标识与每个活动主连接关联的会话。 不可为 Null。 |
login_time | datetime | 建立会话的时间。 不可为 Null。 在查询此 DMV 时,显示尚未完成登录的会话,登录时间为 1900-01-01 。 |
host_name | nvarchar(128) | 特定于会话的客户端工作站名称。 对于内部会话,该值为 NULL。 可以为 Null。 安全说明: 客户端应用程序提供工作站名称,并可能提供不准确的数据。 不要依赖HOST_NAME作为安全功能。 |
program_name | nvarchar(128) | 启动会话的客户端程序的名称。 对于内部会话,该值为 NULL。 可以为 Null。 |
host_process_id | int | 启动会话的客户端程序的进程 ID。 对于内部会话,该值为 NULL。 可以为 Null。 |
client_version | int | 客户端连接到服务器所用接口的 TDS 协议版本。 对于内部会话,该值为 NULL。 可以为 Null。 |
client_interface_name | nvarchar(32) | 客户端用于与服务器通信的库/驱动程序的名称。 对于内部会话,该值为 NULL。 可以为 Null。 |
security_id | varbinary(85) | 与登录名关联的 Microsoft Windows 安全 ID。 不可为 Null。 |
login_name | nvarchar(128) | 当前执行的会话所使用的 SQL Server 登录名。 有关创建此会话的原始登录名,请参阅 original_login_name。 可以是SQL Server经过身份验证的登录名,也可以是经过 Windows 身份验证的域用户名。 不可为 Null。 |
nt_domain | nvarchar(128) | 适用于:SQL Server 2008 (10.0.x) 及更高版本 客户端的 Windows 域(如果使用 Windows 身份验证或可信连接进行会话)。 对于内部会话和非域用户,该值为 NULL。 可以为 Null。 |
nt_user_name | nvarchar(128) | 适用于:SQL Server 2008 (10.0.x) 及更高版本 客户端的 Windows 用户名(如果使用 Windows 身份验证或可信连接进行会话)。 对于内部会话和非域用户,该值为 NULL。 可以为 Null。 |
status | nvarchar(30) | 会话的状态。 可能的值: Running - 当前正在运行一个或多个请求 Sleeping - 当前没有运行任何请求 休眠 - 由于连接池,会话已重置,现在处于预登录状态。 Preconnect - 会话在资源调控器分类器中。 不可为 Null。 |
context_info | varbinary(128) | 会话的 CONTEXT_INFO 值。 上下文信息由用户使用 SET CONTEXT_INFO 语句设置。 可以为 Null。 |
cpu_time | int | 此会话使用的 CPU 时间(以毫秒为单位)。 不可为 Null。 |
memory_usage | int | 该会话所占用的 8 KB 内存页数。 不可为 Null。 |
total_scheduled_time | int | 计划内含请求的会话的执行所耗用的总计时间(毫秒)。 不可为 Null。 |
total_elapsed_time | int | 自会话建立以来已耗用的时间(毫秒)。 不可为 Null。 |
endpoint_id | int | 与会话关联的端点的 ID。 不可为 Null。 |
last_request_start_time | datetime | 最近一次会话请求的开始时间。 这包括当前正在执行的请求。 不可为 Null。 |
last_request_end_time | datetime | 最近一次会话请求的完成时间。 可以为 Null。 |
reads | bigint | 在该会话期间该会话中的请求所执行的读取次数。 不可为 Null。 |
Writes | bigint | 在该会话期间该会话中的请求所执行的写入次数。 不可为 Null。 |
logical_reads | bigint | 在此会话期间,此会话中的请求执行的逻辑读取数。 不可为 Null。 |
is_user_process | bit | 如果会话是系统会话,则为 0。 否则为 1。 不可为 Null。 |
text_size | int | 会话的 TEXTSIZE 设置。 不可为 Null。 |
语言 | nvarchar(128) | 会话的 LANGUAGE 设置。 可以为 Null。 |
date_format | nvarchar(3) | 会话的 DATEFORMAT 设置。 可以为 Null。 |
date_first | smallint | 会话的 DATEFIRST 设置。 不可为 Null。 |
quoted_identifier | bit | 会话的 QUOTED_IDENTIFIER 设置。 不可为 Null。 |
arithabort | bit | 会话的 ARITHABORT 设置。 不可为 Null。 |
ansi_null_dflt_on | bit | 会话的 ANSI_NULL_DFLT_ON 设置。 不可为 Null。 |
ansi_defaults | bit | 会话的 ANSI_DEFAULTS 设置。 不可为 Null。 |
ansi_warnings | bit | 会话的 ANSI_WARNINGS 设置。 不可为 Null。 |
ansi_padding | bit | 会话的 ANSI_PADDING 设置。 不可为 Null。 |
ansi_nulls | bit | 会话的 ANSI_NULLS 设置。 不可为 Null。 |
concat_null_yields_null | bit | 会话的 CONCAT_NULL_YIELDS_NULL 设置。 不可为 Null。 |
transaction_isolation_level | smallint | 会话的事务隔离级别。 0 = 未指定 1 = ReadUncommitted 2 = 已提交读取 3 = RepeatableRead 4 = 可序列化 5 = 快照 不可为 Null。 |
lock_timeout | int | 会话的 LOCK_TIMEOUT 设置。 该值以毫秒计。 不可为 Null。 |
deadlock_priority | int | 会话的 DEADLOCK_PRIORITY 设置。 不可为 Null。 |
row_count | bigint | 到目前为止会话返回的行数。 不可为 Null。 |
prev_error | int | 会话返回的最近一个错误的 ID。 不可为 Null。 |
original_security_id | varbinary(85) | 与original_login_name关联的 Microsoft Windows 安全 ID。 不可为 Null。 |
original_login_name | nvarchar(128) | SQL Server客户端用于创建此会话的登录名。 可以是SQL Server经过身份验证的登录名、经过 Windows 身份验证的域用户名或包含的数据库用户。 在初始连接后,会话可能经过许多隐式或显式上下文切换。 例如,如果使用 EXECUTE AS 。 不可为 Null。 |
last_successful_logon | datetime | 适用于:SQL Server 2008 (10.0.x) 及更高版本 当前会话开始前 original_login_name 上一次成功登录的时间。 |
last_unsuccessful_logon | datetime | 适用于:SQL Server 2008 (10.0.x) 及更高版本 当前会话开始前,original_login_name 上一次登录失败的时间。 |
unsuccessful_logons | bigint | 适用于:SQL Server 2008 (10.0.x) 及更高版本 在 last_successful_logon 和 login_time 之间 original_login_name 的登录失败次数。 |
group_id | int | 此会话所属工作负荷组的 ID。 不可为 Null。 |
database_id | smallint | 适用于:SQL Server 2012 (11.x) 及更高版本 每个会话的当前数据库的 ID。 |
authenticating_database_id | int | 适用于:SQL Server 2012 (11.x) 及更高版本 对主体进行身份验证的数据库的 ID。 对于登录名,该值将为 0。 对于包含数据库用户,该值将为包含数据库的数据库 ID。 |
open_transaction_count | int | 适用于:SQL Server 2012 (11.x) 及更高版本 每个会话的打开事务数。 |
pdw_node_id | int | 适用于:Azure Synapse Analytics、Analytics Platform System (PDW) 此分发所在节点的标识符。 |
page_server_reads | bigint | 适用范围:Azure SQL 数据库超大规模 在此会话期间,此会话中的请求执行的页服务器读取数。 不可为 Null。 |
权限
每个人都可以查看自己的会话信息。
SQL Server:需要VIEW SERVER STATE
SQL Server权限才能查看服务器上的所有会话。
SQL 数据库:需要VIEW DATABASE STATE
查看与当前数据库的所有连接。 VIEW DATABASE STATE
无法在数据库中授予 master
。
备注
启用 通用条件符合性启用 服务器配置选项后,登录统计信息将显示在以下列中。
last_successful_logon
last_unsuccessful_logon
unsuccessful_logons
如果未启用此选项,这些列将返回 null 值。 有关如何设置此服务器配置选项的详细信息,请参阅 通用条件符合性已启用服务器配置选项。
Azure SQL 数据库上的管理员连接将看到每个经过身份验证的会话一行。 结果集中显示的“sa”会话对会话的用户配额没有任何影响。 非管理员连接将仅看到与其数据库用户会话相关的信息。
关系基数
源 | 功能 | 对于/应用 | 关系 |
---|---|---|---|
sys.dm_exec_sessions | sys.dm_exec_requests | session_id | 一对零或一对多 |
sys.dm_exec_sessions | sys.dm_exec_connections | session_id | 一对零或一对多 |
sys.dm_exec_sessions | sys.dm_tran_session_transactions | session_id | 一对零或一对多 |
sys.dm_exec_sessions | sys.dm_exec_cursors (session_id |0) | session_id CROSS APPLY OUTER APPLY | 一对零或一对多 |
sys.dm_exec_sessions | sys.dm_db_session_space_usage | session_id | 一对一 |
示例
A. 查找连接到服务器的用户
下例将查找连接到服务器的用户并返回每个用户的会话数。
1 2 3 4 | SELECT login_name, COUNT(session_id) AS session_count FROM sys.dm_exec_sessions GROUP BY login_name; |
B. 查找长时间运行的游标
下例将查找打开时间超过指定时间段的游标、创建游标的用户以及游标所在的会话。
1 2 3 4 5 6 7 8 9 10 11 12 13 | USE master; GO SELECT creation_time, cursor_id, name, c.session_id, login_name FROM sys.dm_exec_cursors(0) AS c INNER JOIN sys.dm_exec_sessions AS s ON c.session_id = s.session_id WHERE DATEDIFF(mi, c.creation_time, GETDATE()) > 5; GO |
C. 查找具有打开事务的空闲会话
下例将查找具有已打开事务的空闲会话。 空闲会话是当前未运行请求的会话。
1 2 3 4 5 6 7 8 9 10 11 12 | SELECT s.* FROM sys.dm_exec_sessions AS s WHERE EXISTS ( SELECT * FROM sys.dm_tran_session_transactions AS t WHERE t.session_id = s.session_id ) AND NOT EXISTS ( SELECT * FROM sys.dm_exec_requests AS r WHERE r.session_id = s.session_id ); |
D. 查找有关查询自己的连接的信息
以下示例收集有关查询自己的连接的信息:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | SELECT c.session_id, c.net_transport, c.encrypt_option, c.auth_scheme, s.host_name, s.program_name, s.client_interface_name, s.login_name, s.nt_domain, s.nt_user_name, s.original_login_name, c.connect_time, s.login_time FROM sys.dm_exec_connections AS c INNER JOIN sys.dm_exec_sessions AS s ON c.session_id = s.session_id WHERE c.session_id = @@SPID; |
sys.dm_exec_requests
返回有关在 SQL Server 中正在执行的每个请求的信息。 有关请求的详细信息,请参阅线程和任务体系结构指南。