sys.dm_exec_sessions (Transact-SQL)

適用於:Microsoft Fabric 中 Microsoft Fabric倉儲中的 SQL ServerAzure SQL 資料庫 Azure SQL 受控執行個體 Azure Synapse AnalyticsAnalytics Platform System (PDW)SQL 分析端點

針對 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 起始會話之用戶端程序的處理程式標識碼。 內部會話的值是NULL。 可為 Null。
client_version int 用戶端用來連線到伺服器的介面 TDS 通訊協定版本。 內部會話的值是NULL。 可為 Null。
client_interface_name nvarchar(32) 用戶端用來與伺服器通訊的連結庫/驅動程式名稱。 內部會話的值是NULL。 可為 Null。
security_id varbinary(85) 與登入相關聯的 Microsoft Windows 安全性標識碼。 不可為 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) 會話的狀態。 可能的值:

執行 - 目前正在執行一或多個要求

睡眠 - 目前未執行任何要求

休眠 - 會話因為連線共用而已重設,現在處於預先狀態。

Preconnect - 會話位於 Resource Governor 分類器中。

不可為 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 與會話相關聯的端點標識碼。 不可為 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。
language nvarchar(128) 會話的語言設定。 可為 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 = ReadCommitted

3 = RepeatableRead

4 = 可串行化

5 = 快照集

不可為 Null。
lock_timeout int 會話LOCK_TIMEOUT設定。 值會以毫秒來表示。 不可為 Null。
deadlock_priority int DEADLOCK_PRIORITY會話的設定。 不可為 Null。
row_count bigint 會話上傳回的數據列數目,最多到這個點。 不可為 Null。
prev_error int 會話上傳回之最後一個錯誤的標識碼。 不可為 Null。
original_security_id varbinary(85) original_login_name相關聯的 Microsoft Windows 安全性識別碼。 不可為 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) 和更新版本

login_time之間 last_successful_logon 嘗試失敗的登入次數original_login_name
group_id int 此工作負載群組的標識碼。 不可為 Null。
database_id smallint 適用於:SQL Server 2012 (11.x) 和更新版本

每個工作階段目前資料庫的識別碼。

在 Azure SQL 資料庫 中,這些值在單一資料庫或彈性集區內是唯一的,但在邏輯伺服器內則不是唯一的。
authenticating_database_id int 適用於:SQL Server 2012 (11.x) 和更新版本

驗證主體的資料庫標識碼。 針對登入,此值會是0。 對於自主資料庫使用者,此值會是自主資料庫的資料庫標識碼。
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

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_transactionsopen_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;

下一步