SQL Server通过动态视图里查找阻塞超过30秒的会话
生活随笔
收集整理的這篇文章主要介紹了
SQL Server通过动态视图里查找阻塞超过30秒的会话
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
SQL Server通過動態視圖里查找阻塞的會話
簡介
對于阻塞我們可以通過動態視圖dm_exec_requests、dm_tran_locks等關聯通過構建遞歸式樹形結構來查找出阻塞超過30秒的會話。
阻塞查詢
WITH Blocked_Sessions AS (-- 找到所有阻塞的會話SELECT sys.dm_exec_requests.blocking_session_id AS lead_session_id,sys.dm_exec_requests.blocking_session_id AS blocking_session_id , 0 CntFROM sys.dm_exec_requestsWHERE blocking_session_id <> 0AND blocking_session_id NOT IN (SELECT session_idFROM sys.dm_exec_requestsWHERE sys.dm_exec_requests.blocking_session_id <> 0)UNION ALL-- 遍歷所有的會話(構建樹型關系)SELECT Blocked_Sessions.lead_session_id, sys.dm_exec_requests.session_id, 1 CntFROM sys.dm_exec_requestsJOIN Blocked_SessionsON Blocked_Sessions.blocking_session_id = sys.dm_exec_requests.blocking_session_id ),Blocked AS (SELECT lead_session_id, SUM(Cnt) AS sessions_blockedFROM Blocked_SessionsGROUP BY lead_session_id) SELECT Blocked.*, DATEDIFF(s, Sess.last_request_start_time, getdate()) seconds_blocking,ISNULL(Req.status,'sleeping') [status], SqlText.text [sql_text],STUFF((SELECT DISTINCT ISNULL(', ' + db.name,'')FROM sys.databases dbJOIN sys.dm_tran_locks lcksON db.database_id = lcks.resource_database_idWHERE lcks.request_session_id = Sess.session_idORDER BY ISNULL(', ' + db.name,'')FOR XML PATH(''),TYPE).value('.','VARCHAR(MAX)'),1,2,'') AS database_list, Conn.client_net_address, Sess.login_name FROM sys.dm_exec_connections Conn LEFT OUTER JOIN sys.dm_exec_sessions SessON Conn.session_id = Sess.session_id JOIN BlockedON Blocked.lead_session_id = Sess.session_id CROSS APPLY sys.dm_exec_sql_text(Conn.most_recent_sql_handle) SqlText LEFT JOIN sys.dm_exec_requests ReqON Req.session_id = Sess.session_id WHERE Blocked.sessions_blocked >= 1 -- 過濾阻塞超過30秒的記錄AND DATEDIFF(s, Sess.last_request_start_time, getdate()) > 30;總結
以上是生活随笔為你收集整理的SQL Server通过动态视图里查找阻塞超过30秒的会话的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 怎么才能成为微粒贷用户
- 下一篇: 一条标准SQL语句是怎么执行之“步步惊心