sys.dm_exec_sessions (Transact-SQL)
适用于: SQL Server Azure SQL 数据库 Azure SQL 托管实例 Azure Synapse Analytics 分析平台系统 (PDW) Microsoft Fabric 中的 SQL 分析端点 Microsoft Fabric 中的仓库
对于 SQL Server 中每个经过身份验证的会话都返回一行。 sys.dm_exec_sessions
是服务器范围的视图,显示了有关所有活动用户连接和内部任务的信息。 此信息包含客户端版本、客户端程序名称、客户端登录时间、登录用户、当前会话设置等。 使用 sys.dm_exec_sessions
,首先可以查看当前的系统负荷并标识相关会话,然后可以通过其他动态管理视图或动态管理函数了解有关该会话的详细信息。
sys.dm_exec_connections
、sys.dm_exec_sessions
和 sys.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 适用于内部会话。 Nullable。安全说明: 客户端应用程序提供工作站名称,并提供不准确的数据。 不要依赖 HOST_NAME 作为安全功能。 |
program_name |
nvarchar(128) | 启动会话的客户端程序的名称。 该值 NULL 适用于内部会话。 Nullable。 |
host_process_id |
int | 启动会话的客户端程序的进程 ID。 该值 NULL 适用于内部会话。 Nullable。 |
client_version |
int | 客户端连接到服务器所用接口的 TDS 协议版本。 该值 NULL 适用于内部会话。 Nullable。 |
client_interface_name |
nvarchar(32) | 客户端用于与服务器通信的库/驱动程序的名称。 该值 NULL 适用于内部会话。 Nullable。 |
security_id |
varbinary(85) | 与登录名关联的 Windows 安全 ID。 不可为 Null。 |
login_name |
nvarchar(128) | 当前执行的会话所使用的 SQL Server 登录名。 有关创建会话的原始登录名,请参阅 original_login_name 。 可以是经过 SQL Server 身份验证的登录 ID,也可以是经过 Windows 身份验证的域用户名。 不可为 Null。 |
nt_domain |
nvarchar(128) | 客户端的 Windows 域(如果使用 Windows 身份验证或可信连接进行会话)。 此值 NULL 适用于内部会话和非域用户。 Nullable。 |
nt_user_name |
nvarchar(128) | 客户端的 Windows 用户名(如果使用 Windows 身份验证或可信连接进行会话)。 此值 NULL 适用于内部会话和非域用户。 Nullable。 |
status |
nvarchar(30) | 会话的状态。 可能的值:Running - 当前运行一个或多个请求Sleeping - 当前未运行任何请求Dormant - 由于连接池,会话已重置,现在处于预登录状态。Preconnect - 会话位于 Resource Governor 分类器中。不可为 Null。 |
context_info |
varbinary(128) | CONTEXT_INFO 会话的值。 用户使用 SET CONTEXT_INFO 语句设置上下文信息。 Nullable。 |
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 | 最近一次会话请求的完成时间。 Nullable。 |
reads |
bigint | 在该会话期间该会话中的请求所执行的读取次数。 不可为 Null。 |
writes |
bigint | 在该会话期间该会话中的请求所执行的写入次数。 不可为 Null。 |
logical_reads |
bigint | 在此会话期间,由此会话中的请求执行的逻辑读取次数。 不可为 Null。 |
is_user_process |
bit | 0 如果会话是系统会话,则为 。 否则为 1 。 不可为 Null。 |
text_size |
int | TEXTSIZE 会话的设置。 不可为 Null。 |
language |
nvarchar(128) | LANGUAGE 会话的设置。 Nullable。 |
date_format |
nvarchar(3) | DATEFORMAT 会话的设置。 Nullable。 |
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 = Unspecified 1 = ReadUncommitted 2 = ReadCommitted 3 = RepeatableRead 4 = Serializable 5 = Snapshot 不可为 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 . 关联的 Windows 安全 ID。 不可为 Null。 |
original_login_name |
nvarchar(128) | 客户端用于创建此会话的 SQL Server 登录 ID。 可以是经过 SQL Server 身份验证的登录 ID、经过 Windows 身份验证的域用户名,也可以是包含数据库用户。 会话在初始连接后可能经过许多隐式或显式上下文切换,例如,如果使用 EXECUTE AS 。 不可为 Null。 |
last_successful_logon |
datetime | 当前会话开始前最后一次成功登录 original_login_name 的时间。 |
last_unsuccessful_logon |
datetime | 当前会话开始前最后一次失败登录尝试 original_login_name 的时间。 |
unsuccessful_logons |
bigint | 两last_successful_logon login_time 者之间失败的登录尝试次数original_login_name 。 |
group_id |
int | 此会话所属工作负荷组的 ID。 不可为 Null。 |
database_id |
smallint | 每个会话的当前数据库的 ID。 在 Azure SQL 数据库中,这些值在单一数据库或弹性池中是唯一的,但在逻辑服务器中不是唯一的。 适用于:SQL Server 2012 (11.x) 及更高版本。 |
authenticating_database_id |
int | 对主体进行身份验证的数据库的 ID。 对于登录名,值为 0 . 对于包含的数据库用户,该值是包含数据库的数据库 ID。适用于:SQL Server 2012 (11.x) 及更高版本。 |
open_transaction_count |
int | 每个会话的打开事务数。 适用于:SQL Server 2012 (11.x) 及更高版本。 |
pdw_node_id |
int | 此分发所在节点的标识符。 适用于:Azure Synapse Analytics 和 Analytics 平台系统(PDW)。 |
page_server_reads |
bigint | 在此会话期间,由此会话中的请求执行的页面服务器读取次数。 不可为 Null。 适用于:Azure SQL 数据库“超大规模”。 |
权限
每个人都可以查看自己的会话信息。
在 SQL Server 2019(15.x)和早期版本中,需要 VIEW SERVER STATE
查看服务器上的所有会话。 在 SQL Server 2022(16.x)及更高版本中,需要 VIEW SERVER PERFORMANCE STATE
对服务器具有权限。
在SQL 数据库中,需要VIEW DATABASE STATE
查看所有到当前数据库的连接。 无法在 master
数据库中授予 VIEW DATABASE STATE
权限。
注解
common criteria compliance enabled
启用服务器配置选项后,登录统计信息将显示在以下列中。
last_successful_logon
last_unsuccessful_logon
unsuccessful_logons
如果未启用此选项,这些列将返回 null 值。 有关如何设置此服务器配置选项的详细信息,请参阅 服务器配置:已启用通用条件符合性。
Azure SQL 数据库上的管理员连接会看到每个经过身份验证的会话一行。 sa
结果集中显示的会话对会话的用户配额没有任何影响。 非管理员连接仅看到与其数据库用户会话相关的信息。
由于记录方式的差异,open_transaction_count
可能与 .open_transaction_count
.sys.dm_tran_session_transactions
关系基数
源 | 功能 | 对于/应用 | 关系 |
---|---|---|---|
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;