PCB SQL SERVER 資料庫阻塞程序關係以思維導圖方式呈現的實現方法
阿新 • • 發佈:2019-07-19
最近公司資料庫同步機制常發生阻塞,時不時的導致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套用資料即可實現)
http://pcbren.cn/DB_BlockedView.html 四.阻塞程序資料來源 通過此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
&nbs