• 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
     
  • 相关阅读:
    Application.Exit()结束程序,但线程还在的解决方法
    Myeclipse2014 SVN安装方法以及项目上传到svn服务器
    MyEclipse中把JSP默认编码改为UTF-8
    005_MyEclipse编码设置
    laravel5.2学习资源
    wechat-php-sdk
    微信邀请卡的开发
    微信JS-SDK实际分享功能
    每个Linux新手都应该记住的10个基本Linux命令
    Linux下定时备份数据库
  • 原文地址:https://www.cnblogs.com/pcbren/p/11210887.html
Copyright © 2020-2023  润新知