最近公司數據庫同步機制常發生阻塞,時不時的導致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
