PCB SQL SERVER 數據庫阻塞進程關系以思維導圖方式呈現的實現方法


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

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM