Sql-Server

請求和會話有什麼區別?

  • August 9, 2022

我正在探索 sql dmv - sys.dm_exec_requests 和 sys.dm_exe_sessions

我觀察到 sys.dm_exe_sessions 中存在的 session_id 在 sys.dm_exec_requests 中不存在。

例如 - 在 sys.db_exec_requests 中有一條等待類型為的記錄,LCK_M_X等待資源為KEY: 2......。sys.dm_exec_requests 中未顯示相應的阻塞會話 ID。它顯示在 sys.dm_exec_sessions 中,狀態為sleeping. 這意味著什麼?

請求和會話有什麼區別?

在 SQL Server 的連接模型中,存在三個概念:連接、會話和請求。

會話代表客戶端和伺服器之間關係的邏輯狀態,而連接代表實際的物理網路連接。

一個客戶端可以建立多個物理連接,並且可以有多個會話。通常這些是一一對應的,除了沒有底層連接的系統會話。(理論上,也可以將多個客戶端連接連接到單個會話,但這是不尋常的)。


然後一個會話可以發出一個或多個請求,這些請求sys.dm_exec_requestssys.dm_exec_sessions.

在使用MARS的情況下,每個會話可能有多個活動請求,這就是它是一對多關係的原因。

sys.dm_exec_requests - “返回有關在 SQL Server 中執行的每個請求的資訊。

本質上,這是每個正在執行的查詢和數據庫命令的視圖。這裡的session_idin 應該與sys.dm_exec_sessions. 從某種意義上說,這是一個子視圖sys.dm_exec_sessions

sys.dm_exec_sessions - “在 SQL Server 上每個經過身份驗證的會話返回一行。sys.dm_exec_sessions是一個伺服器範圍的視圖,顯示有關所有活動使用者連接和內部任務的資訊。

這實質上是與 SQL Server 實例的每個連接的視圖。如果有人連接到伺服器但沒有主動執行任何查詢,那麼您將不會session_id在視圖中從該視圖中看到他們sys.dm_exec_requests。從某種意義上說,這是一個父視圖sys.dm_exec_requests

引用自:https://dba.stackexchange.com/questions/315415