sys.dm_exec_sessions (Transact-SQL)

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

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

sys.dm_exec_connectionssys.dm_exec_sessionssys.dm_exec_requests 动态管理视图映射到已弃用的 sys.sysprocesses 系统兼容性视图。

注意

要从 Azure Synapse Analytics 或 Analytics Platform System (PDW) 中的专用 SQL 池中调用它,请参阅 sys.dm_pdw_nodes_exec_sessions。 对于无服务器 SQL 池或 Microsoft Fabric,请使用 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 身份验证的登录 ID,也可以是经过 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 - 当前没有运行任何请求

Dormant – 会话因连接池而重置,现在处于登录前状态。

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) 与 <a0/a0> 关联的 Microsoft Windows 安全 ID。 不可为 Null。
original_login_name nvarchar(128) 客户端用于创建此会话的 SQL Server 登录 ID。 可以是经过 SQL Server 身份验证的登录 ID、经过 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_logonlogin_time者之间失败的登录尝试次数original_login_name
group_id int 此会话所属工作负荷组的 ID。 不可为 Null。
database_id smallint 适用于:SQL Server 2012 (11.x) 及更高版本

每个会话的当前数据库的 ID。

在 Azure SQL 数据库中,这些值在单一数据库或弹性池中是唯一的,但在逻辑服务器中不是唯一的。
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:需要 SQL Server 上的 VIEW SERVER STATE 权限才能查看服务器上的所有会话。

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

SQL Server 2022 及更高版本的权限

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

备注

当启用“已启用通用标准符合性”服务器配置选项时,将在以下各列中显示登录统计信息。

  • last_successful_logon
  • last_unsuccessful_logon
  • unsuccessful_logons

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

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

由于记录它们的方式存在差异, open_transaction_count 因此可能与 sys.dm_tran_session_transactions.open_transaction_count.

关系基数

功能 对于/应用 关系
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. 查找连接到服务器的用户

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

SELECT login_name,
    COUNT(session_id) AS session_count
FROM sys.dm_exec_sessions
GROUP BY login_name;

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

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

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. 查找具有已打开事务的空闲会话

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

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. 查找有关查询自有连接的信息

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

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;

后续步骤