在 SQL Server 中查詢活動連線和死鎖

Broadm發表於2022-07-15

在SQL Server中有幾種方法可以找到活動的 SQL 連線。讓我們看看一些使用 T-SQL 查詢的簡單快捷的方法。

SP_WHO

SP_WHO 是 SQL Server 內建的系統儲存過程, 其他方法相比,SP_WHO 將具有最少的列,但是一種快速列出活動連線的方法。

以下是在 SQL Server Management Studio 中的執行示例:

EXEC SP_WHO

image

具體的欄位解釋請參閱官方文件 SP_WHO
其中比較重要的列是:

  • spid: 會話ID
  • loginname: 登入賬號
  • blk: 阻塞程式的會話ID(如果存在)。否則,此列為零, 可以使用該列排查死鎖

SYS.SYSPROCESSES

另一種查詢活動 SQL 連線的絕妙方法是使用系統相容性檢視 SYS.SYSPROCESSES
此檢視有很多列,其中包含很多資訊,這些資訊有助於您找出活動的 sql 連線,尤其是當您想要查詢被阻塞的程式時。但是,這是向後相容的檢視,不建議使用,因為未來的版本可能會刪除它

以下是在 SQL Server Management Studio 中的執行示例:

SELECT * FROM SYS.SYSPROCESSES

image

具體的欄位解釋請參閱官方文件 SYS.SYSPROCESSES

SYS.DM_EXEC_SESSIONS (建議使用)

SYS.DM_EXEC_SESSIONS 是替代舊系統表 sysprocesses 的動態管理檢視之一。SYS.DM_EXEC_SESSIONS 的優點是它的列 is_user_process 。使用此列,您可以輕鬆過濾掉系統程式。

以下是在 SQL Server Management Studio 中的執行示例:

SELECT * FROM SYS.DM_EXEC_SESSIONS where is_user_process = 1

image

具體的欄位解釋請參閱官方文件 SYS.DM_EXEC_SESSIONS

用於查詢 SQL Server 中的死鎖的 T-SQL 查詢

下面是我用來快速查詢死鎖的查詢。此語句基於SYS.DM_EXEC_REQUESTS 動態管理檢視。在此語句中,blocking_session_id 列為您提供了阻塞連線的 session_id,而 wait_type 列為您提供了導致 deadlock 的 等待型別。獲得blocking_session_id 後,您可以使用 SYS.DM_EXEC_SESSIONS 來獲取有關會話或連線的更多詳細資訊。

SELECT
    session_id,
    start_time, 
    [status],
    command,
    blocking_session_id,
    wait_type,
    wait_time,
    open_transaction_count,
    transaction_id,
    total_elapsed_time,
    Definition = CAST(text AS VARCHAR(MAX))
FROM
    SYS.DM_EXEC_REQUESTS
    CROSS APPLY sys.dm_exec_sql_text(sql_handle) 
WHERE blocking_session_id != 0

image

上圖我們得到了正在發生阻塞的會話資訊和所執行的SQL語句(Definition)

相關文章