天天看点

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/

声明:本博客原创文字只代表本人工作中在某一时间内总结的观点或结论,与本人所在单位没有直接利益关系。非商业,未授权,贴子请以现状保留,转载时必须保留此段声明,且在文章页面明显位置给出原文连接。

如果大家感觉我的博文对大家有帮助,请推荐支持一把。