分享方式:


sys.dm_exec_sessions(Transact-SQL)

適用於:SQL ServerAzure SQL 資料庫Azure SQL 受控執行個體Azure Synapse Analytics分析平台系統(PDW)Microsoft Fabric 中的 SQL 分析端點Microsoft Fabric 中的倉儲Microsoft Fabric 中的 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(僅限專用 SQL 池)或 Analytics Platform System(PDW)呼叫此檢視,請參見 sys.dm_pdw_nodes_exec_sessions。 可用於 sys.dm_exec_sessions Azure Synapse Analytics(僅限伺服器 SQL 池)或 Microsoft Fabric。

資料行名稱 資料類型 可空值 Description
session_id smallint 識別每個使用中的主要連接所關聯的工作階段。
login_time datetime 建立會話的時間。 在查詢此 DMV 時尚未完全登入的工作階段,會以的 1900-01-01登入時間顯示。
host_name nvarchar(128) Yes 針對特定會話的客戶端工作站名稱。 此值適用於 NULL 內部會話。

安全性注意事項: 用戶端應用程式提供工作站名稱,並提供不正確的數據。 請勿依賴 HOST_NAME 做為安全性功能。
program_name nvarchar(128) Yes 起始工作階段的用戶端程式名稱。 此值適用於 NULL 內部會話。
host_process_id int Yes 起始會話之用戶端程序的處理程式標識碼。 此值適用於 NULL 內部會話。
client_version int Yes 用戶端用來連接伺服器的 TDS 協定介面版本。 此值適用於 NULL 內部會話。
client_interface_name nvarchar(32) Yes 用戶端用來與伺服器通訊的連結庫/驅動程式名稱。 此值適用於 NULL 內部會話。
security_id varbinary(85) 與登入相關聯的 Windows 安全性識別碼。
login_name nvarchar(128) 目前用來執行工作階段的 SQL Server 登入名稱。 如需建立工作階段的原始登入名稱,請參閱 original_login_name。 可以是 SQL Server 驗證的登入名稱或 Windows 驗證的功能變數名稱。
nt_domain nvarchar(128) Yes 如果會話使用 Windows 驗證或受信任的連線,則用戶端的 Windows 網域。 此值 NULL 適用於內部工作階段和非網域使用者。
nt_user_name nvarchar(128) Yes 如果會話使用 Windows 驗證或受信任的連線,用戶端的 Windows 用戶名稱。 此值 NULL 適用於內部工作階段和非網域使用者。
status nvarchar(30) 會話的狀態。 可能的值:

Running - 目前執行一或多個要求
Sleeping - 目前未執行任何要求
Dormant - 因為連線共用而已重設會話,且目前處於預先狀態。
Preconnect - 會話位於 Resource Governor 分類器中。
context_info varbinary(128) Yes CONTEXT_INFO 會話的值。 內容資訊是由使用者使用 SET CONTEXT_INFO 語句所設定。
cpu_time int 此會話所使用的CPU時間,以毫秒為單位。
memory_usage int 此工作階段所使用的 8 KB 記憶體頁數。
total_scheduled_time int 總時間,以毫秒為單位,會話(內的要求)已排程執行。
total_elapsed_time int 建立會話後的時間,以毫秒為單位。
endpoint_id int 與會話相關聯的端點標識碼。
last_request_start_time datetime 會話上最後一個要求開始的時間。 這次包含目前正在執行的要求。
last_request_end_time datetime Yes 會話上最後一次完成要求的時間。
reads bigint 在本會話中,透過請求執行的物理讀取次數。
writes 1 bigint 在此會話中,透過請求執行的物理寫入次數。
logical_reads bigint 在此會話期間,此會話中的要求所執行的邏輯讀取數目。
is_user_process bit 0 如果工作階段是系統工作階段,則為 。 否則,便為 1
text_size int TEXTSIZE 會話的設定。
language nvarchar(128) Yes LANGUAGE 會話的設定。
date_format nvarchar(3) Yes DATEFORMAT 會話的設定。
date_first smallint DATEFIRST 會話的設定。
quoted_identifier bit QUOTED_IDENTIFIER 會話的設定。
arithabort bit ARITHABORT 會話的設定。
ansi_null_dflt_on bit ANSI_NULL_DFLT_ON 會話的設定。
ansi_defaults bit ANSI_DEFAULTS 會話的設定。
ansi_warnings bit ANSI_WARNINGS 會話的設定。
ansi_padding bit ANSI_PADDING 會話的設定。
ansi_nulls bit ANSI_NULLS 會話的設定。
concat_null_yields_null bit CONCAT_NULL_YIELDS_NULL 會話的設定。
transaction_isolation_level smallint 會話的交易隔離等級。

0 = Unspecified
1 = ReadUncommitted
2 = ReadCommitted
3 = RepeatableRead
4 = Serializable
5 = Snapshot
lock_timeout int LOCK_TIMEOUT 會話的設定。 值會以毫秒來表示。
deadlock_priority int DEADLOCK_PRIORITY 會話的設定。
row_count bigint 會話上傳回的數據列數目,最多到這個點。
prev_error int 會話上傳回之最後一個錯誤的標識碼。
original_security_id varbinary(85) original_login_name相關聯的 Windows 安全性識別符。
original_login_name nvarchar(128) 用戶端用來建立此工作階段的 SQL Server 登入名稱。 可以是 SQL Server 驗證的登入名稱、Windows 驗證的功能變數名稱或自主資料庫使用者。 該會話在初始連線後可能經歷多次隱含或顯式上下文切換,例如若使用 EXECUTE AS
last_successful_logon datetime Yes 在目前會話開始前的最後一次成功登入 original_login_name 時間。
last_unsuccessful_logon datetime Yes 在目前會話開始之前,上次失敗登入嘗試 original_login_name 的時間。
unsuccessful_logons bigint Yes original_login_name之間 last_successful_logon 嘗試失敗的登入次數login_time
group_id int 此工作負載群組的標識碼。
database_id smallint 每個工作階段目前資料庫的識別碼。

在 Azure SQL 資料庫中,這些值在單一資料庫或彈性集區內是唯一的,但在邏輯伺服器內則不是唯一的。

適用於:SQL Server 2012 (11.x) 和更新版本。
authenticating_database_id int Yes 驗證主體的資料庫標識碼。 針對登入,值為 0。 對於自主資料庫使用者,此值是自主資料庫的資料庫標識碼。

適用於:SQL Server 2012 (11.x) 和更新版本。
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 資料庫 超大規模資料庫。
contained_availability_group_id uniqueidentifier Yes 包含的可用群組識別碼。

適用於:SQL Server 2025(17.x)及更新版本。

1 指定頁面何時在緩衝池中被標記為髒。 這個值並不直接等同於實際寫入次數,因為同一頁面可以被標記多次。 這些計數器會在批次結束時彙整。

權限

每個人都可以看到自己的會話資訊。

在 SQL Server 2019 (15.x) 和舊版中,需要 VIEW SERVER STATE 查看伺服器上的所有會話。 在 SQL Server 2022 (16.x) 和更新版本中,需要 VIEW SERVER PERFORMANCE STATE 伺服器上的許可權。

在 SQL 資料庫 中,需要VIEW DATABASE STATE查看目前資料庫的所有連線。 VIEW DATABASE STATE 無法在資料庫中授與 master

備註

common criteria compliance enabled啟用伺服器組態選項時,登入統計數據會顯示在下列數據行中。

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

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;