天天看點

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

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套用資料即可實作)

   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

作者:pcbren

QQ交流群:PCB之腳本也泛濫

部落格位址:

https://www.cnblogs.com/pcbren/

聲明:本部落格原創文字隻代表本人工作中在某一時間内總結的觀點或結論,與本人所在機關沒有直接利益關系。非商業,未授權,貼子請以現狀保留,轉載時必須保留此段聲明,且在文章頁面明顯位置給出原文連接配接。

如果大家感覺我的博文對大家有幫助,請推薦支援一把。