分享方式:


sys.dm_exec_sessions (Transact-SQL)

適用於:SQL Server Azure SQL 資料庫 Azure SQL 受控執行個體 Azure Synapse Analytics Analytics 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 起始會話之用戶端程序的處理程式標識碼。 此值適用於 NULL 內部會話。 可為 Null。
client_version int 用戶端用來連線到伺服器的介面 TDS 通訊協定版本。 此值適用於 NULL 內部會話。 可為 Null。
client_interface_name nvarchar(32) 用戶端用來與伺服器通訊的連結庫/驅動程式名稱。 此值適用於 NULL 內部會話。 可為 Null。
security_id varbinary(85) 與登入相關聯的 Windows 安全性識別碼。 不可為 Null。
login_name nvarchar(128) 目前用來執行工作階段的 SQL Server 登入名稱。 如需建立工作階段的原始登入名稱,請參閱 original_login_name。 可以是 SQL Server 驗證的登入名稱或 Windows 驗證的功能變數名稱。 不可為 Null。
nt_domain nvarchar(128) 如果會話使用 Windows 驗證或受信任的連線,則用戶端的 Windows 網域。 此值 NULL 適用於內部工作階段和非網域使用者。 可為 Null。
nt_user_name nvarchar(128) 如果會話使用 Windows 驗證或受信任的連線,用戶端的 Windows 用戶名稱。 此值 NULL 適用於內部工作階段和非網域使用者。 可為 Null。
status nvarchar(30) 會話的狀態。 可能的值:

Running - 目前執行一或多個要求
Sleeping - 目前未執行任何要求
Dormant - 因為連線共用而已重設會話,且目前處於預先狀態。
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) 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 = 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 會話上傳回之最後一個錯誤的標識碼。 不可為 Null。
original_security_id varbinary(85) original_login_name相關聯的 Windows 安全性識別符。 不可為 Null。
original_login_name nvarchar(128) 用戶端用來建立此工作階段的 SQL Server 登入名稱。 可以是 SQL Server 驗證的登入名稱、Windows 驗證的功能變數名稱或自主資料庫使用者。 會話可能會在初始連接之後經過許多隱含或明確的內容切換,例如,如果使用 EXECUTE AS 。 不可為 Null。
last_successful_logon datetime 在目前會話開始前的最後一次成功登入 original_login_name 時間。
last_unsuccessful_logon datetime 在目前會話開始之前,上次失敗登入嘗試 original_login_name 的時間。
unsuccessful_logons bigint login_time之間 last_successful_logon 嘗試失敗的登入次數original_login_name
group_id int 此工作負載群組的標識碼。 不可為 Null。
database_id smallint 每個工作階段目前資料庫的識別碼。

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

適用於:SQL Server 2012 (11.x) 和更新版本。
authenticating_database_id int 驗證主體的資料庫標識碼。 針對登入,值為 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 在此工作階段期間,此工作階段中的要求所執行的頁面伺服器讀取數目。 不可為 Null。

適用於:Azure SQL 資料庫 超大規模資料庫。

權限

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

在 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_id0 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;