最近公司資料庫同步機制常發生阻塞,時不時的導致PCB工程系統卡死現象,只有找到阻塞源頭並處理掉,才以消除阻塞,但資料庫中檢視會話阻塞是通過二維表方式展示的父子會話程式ID的,是很難清楚的展示各會話程式ID的關係圖的。
舉例:這好比公路上的汽車我們開車前行,遇到前方塞車了,前方的車阻塞你,但後方又繼續來車,你也成為後方的車阻塞者。
如果能以思維導圖的方式展示那不完美了,我們可以通過此圖可很快的找找到阻焊塞的源頭,只要把源頭打通,道路才能保持暢通。
一.阻塞查詢相關SQL語句
查詢當前資料庫阻塞:
select * from sys.sysprocesses where blocked<>0
查詢阻塞的會話在執行的SQL以及執行狀態:
select * from sys.sysprocesses where spid=197
查詢阻塞會話執行所有DB庫
select * from sys.sysdatabases WHERE dbid = 7
通過sql_handle控制程式碼來查詢正在跑的SQL的SQL_TEXT文字內容,即SQL內容:
SELECT * FROM ::FN_GET_SQL(0x0300FF7F587A2F063508ED005E9B000001000000)
刪除程式會話ID
KILL 197
二.阻塞程式思維導圖----展示效果
通過如圖展示,非常清楚的知道阻塞程式源頭來自哪個程式號了【源頭:會話程式ID 536導致整個資料庫阻塞】
三.HTML實現程式碼
HTML實現程式碼:(用百度他們家的echar套用資料即可實現)
四.阻塞程式資料來源
通過此SQL取出2部份資料
1.EChart nodes 節點資料
2.EChart links 關連關係資料
--查詢當前資料庫阻塞程式插入臨時表 select * INTO #sysprocesses FROM sys.sysprocesses where blocked<>0 --獲取程式節點【資料給到EChart nodes】 --將資料按3個等級分類,按例項圖展示效果 SELECT ' {category:'+ (CASE WHEN PerentCount = 0 THEN '0' WHEN ChildCount > 0 THEN '1' ELSE '2' END) +', name: '''+ CAST(spid AS VARCHAR(1000)) +''', value : '+ (CASE WHEN PerentCount = 0 THEN '3' WHEN ChildCount > 0 THEN '2' ELSE '1' END) + '},' FROM ( SELECT (SELECT COUNT(1) FROM #sysprocesses WHERE blocked = t.spid) ChildCount ,(SELECT COUNT(1) FROM #sysprocesses WHERE spid = t.spid) PerentCount ,spid FROM ( SELECT spid spid FROM #sysprocesses UNION ALL SELECT blocked spid FROM #sysprocesses ) t GROUP BY spid ) t --獲取節點之前的關連關係【資料給到EChart links】 SELECT '{source : '''+ CAST(spid AS VARCHAR(1000)) +''', target : '''+ CAST(blocked AS VARCHAR(1000))+''', weight : 1},' FROM #sysprocesses drop table #sysprocesses