PCB SQL SERVER 資料庫阻塞程式關係以思維導圖方式呈現的實現方法

pcbren發表於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套用資料即可實現)

 
 
 四.阻塞程式資料來源
       通過此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

 

 

相關文章