场景:

客户抱怨数据库慢,但是回去看的时候,可能已经不慢了,为了查出当时到底是什么原因导致数据慢,制作了下面的存储过程,然后每隔3分钟运行一遍,把blocking信息插入一个数据库中。

主要就是查询sys.processes这个dmv,然后根据sql handle获取sql text, 把信息分别保存到2张表中。 目前来看,工作比较顺利,找到了数据库中不少造成阻塞的信息,也给开发那边一个交代。

 USE [MonitorBlocking]
GO
/****** Object: StoredProcedure [dbo].[checkBlocking] Script Date: 8/16/2017 3:01:35 PM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[checkBlocking]
AS
BEGIN
SET NOCOUNT ON;
---返回有多少行受影响
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
---设置隔离级别,避免产生锁
declare @Duration int -- in milliseconds, 1000 = 1 sec
declare @now datetime
declare @Processes int
select @Duration = 100 -- in milliseconds, 1000 = 1 sec
select @Processes = 0
select @now = getdate()
---创建临时表
CREATE TABLE #Blocks_rg(
[spid] smallint,
[kpid] smallint,
[blocked] smallint,
[waitType] binary(2),
[waitTime] bigInt,
[lastWaitType] nchar(32),
[waitResource] nchar(256),
[dbID] smallint,
[uid] smallint,
[cpu] int,
[physical_IO] int,
[memusage] int,
[login_Time] datetime,
[last_Batch] datetime,
[open_Tran] smallint,
[status] nchar(30),
[sid] binary(86),
[hostName] nchar(128),
[program_Name] nchar(128),
[hostProcess] nchar(10),
[cmd] nchar(16),
[nt_Domain] nchar(128),
[nt_UserName] nchar(128),
[net_Library] nchar(12),
[loginName] nchar(128),
[context_Info] binary(128),
[sqlHandle] binary(20),
[CapturedTimeStamp] datetime
) 将阻塞信息插入临时表
INSERT INTO #Blocks_rg
SELECT
[spid],
[kpid],
[blocked],
[waitType],
[waitTime],
[lastWaitType],
[waitResource],
[dbID],
[uid],
[cpu],
[physical_IO],
[memusage],
[login_Time],
[last_Batch],
[open_Tran],
[status],
[sid],
[hostName],
[program_name],
[hostProcess],
[cmd],
[nt_Domain],
[nt_UserName],
[net_Library],
[loginame],
[context_Info],
[sql_Handle],
@now as [Capture_Timestamp]
FROM master..sysprocesses where blocked <> 0
AND waitTime > @Duration
----等待时间大于1s的会被捕捉 SET @Processes = @@rowcount
---返回多少行,赋值给Processer ---加入捕捉时间
INSERT into #Blocks_rg
SELECT src.[spid],
src.[kpid],
src.[blocked],
src.[waitType],
src.[waitTime],
src.[lastWaitType],
src.[waitResource],
src.[dbID],
src.[uid],
src.[cpu],
src.[physical_IO],
src.[memusage],
src.[login_Time],
src.[last_Batch],
src.[open_Tran],
src.[status],
src.[sid],
src.[hostName],
src.[program_name],
src.[hostProcess],
src.[cmd],
src.[nt_Domain],
src.[nt_UserName],
src.[net_Library],
src.[loginame],
src.[context_Info],
src.[sql_Handle]
,@now as [Capture_Timestamp]
FROM master..sysprocesses src inner join #Blocks_rg trgt
on trgt.blocked = src.[spid] if @Processes > 0
---根据sql handle 依次查出SQL Text, 然后插入[Blocking_SqlText]表
BEGIN
INSERT [dbo].[Blocking_sysprocesses]
SELECT * from #Blocks_rg DECLARE @SQL_Handle binary(20), @SPID smallInt;
DECLARE cur_handle CURSOR FOR SELECT sqlHandle, spid FROM #Blocks_rg;
OPEN cur_Handle
FETCH NEXT FROM cur_handle INTO @SQL_Handle, @SPID
WHILE (@@FETCH_STATUS = 0)
BEGIN INSERT [dbo].[Blocking_SqlText]
SELECT @SPID, CONVERT(nvarchar(4000), [text]) ,@now as [Capture_Timestamp] from ::fn_get_sql(@SQL_Handle) FETCH NEXT FROM cur_handle INTO @SQL_Handle, @SPID
END
CLOSE cur_Handle
DEALLOCATE cur_Handle END DROP table #Blocks_rg END

SQL捕捉blocking信息的更多相关文章

  1. 如何有效抓取SQL Server的BLOCKING信息

    原文:如何有效抓取SQL Server的BLOCKING信息 转自:微软亚太区数据库技术支持组 官方博客 http://blogs.msdn.com/b/apgcdsd/archive/2011/12 ...

  2. SQL查询数据库信息, 数据库表名, 数据库表信息

    SQL查询数据库信息, 数据库表名, 数据库表信息 ---------------------------------------------- -- 以下例子, 在sql_server 中可以直接运 ...

  3. 使用ttXactAdmin、ttSQLCmdCacheInfo、ttSQLCmdQueryPlan获取SQL相关具体信息[TimesTen运维]

    使用ttXactAdmin.ttSQLCmdCacheInfo.ttSQLCmdQueryPlan获取SQL相关具体信息,适合于tt11以上版本号. $ ttversion TimesTen Rele ...

  4. 使用SQLdiag Utility搜集SQL Server诊断信息

    SQLdiag Utility用于搜集诊断信息,给Microsoft技术支持人员做为判断依据. 使用SQLdiag 会进行信息搜集类型 Windows 系统性能日志 Windows 系统日志 SQL ...

  5. 查询某库所有表的rows &查看当前sql的注册信息

    查询某库所有表的rows &查看当前sql的注册信息 1 2 3 4 5 6 7 select sobj.name,spar.rows FROM sys.objects sobj  INNER ...

  6. 将SQL获取的信息传递到Email中

    将SQL获取的信息传递到Email中 最近在为公司财务开发一个邮件通知时遇到了一个技术问题.原来我设计SSIS的是每天将ERP系统支付数据导出到财务支付平台后 Email 通知财务,然后财务到支付平台 ...

  7. 全废话SQL Server统计信息(2)——统计信息基础

    接上文:http://blog.csdn.net/dba_huangzj/article/details/52835958 我想在大地上画满窗子,让所有习惯黑暗的眼睛都习惯光明--顾城<我是一个 ...

  8. 全废话SQL Server统计信息(1)——统计信息简介

    当心空无一物,它便无边无涯.树在.山在.大地在.岁月在.我在.你还要怎样更好的世界?--张晓风<我在> 为什么要写这个内容? 随着工作经历的积累,越来越感觉到,大量的关系型数据库的性能问题 ...

  9. 【原创】大叔经验分享(18)hive2.0以后通过beeline执行sql没有进度信息

    一 问题 在hive1.2中使用hive或者beeline执行sql都有进度信息,但是升级到hive2.0以后,只有hive执行sql还有进度信息,beeline执行sql完全silence,在等待结 ...

随机推荐

  1. 删除eclipse无效的工作空间路径

    eclipse会记录我们使用过的工作空间的路径,方便下面使用.也可以根据自己的需要删除无用的工作空间路径.

  2. cocos2d-x中描述精灵帧图片的plist和json文件各个key的含义

    最近在研究cocos,互联网行业中,手游业最近的表现是非常的火,加上本身对游戏有浓厚兴趣,所以便染指了游戏引擎~ 这次的废话就这么简短吧,因为这次记录的东西本身就很少. 在cocos中,为精灵帧添加缓 ...

  3. Linux下SSH工具 PAC Manager的安装

    PAC Manager, Linux下类似SecureCRT Xshell的SSH工具,该工具功能上相当的不错,完全可以代替SecureCRT Xshell的功能. PAC (Perl Auto Co ...

  4. 在WPF中如何使用RelativeSource绑定

    在WPF绑定的时候,指定绑定源时,有一种办法是使用RelativeSource. 这种办法的意思是指当前元素和绑定源的位置关系. 第一种关系: Self 举一个最简单的例子:在一个StackPanel ...

  5. Innosetup中在安装界面左下角添加超链接

    在程序的安装界面左下角加上超链接,如下图: 1. 新建一个标签,这里使用的控件是TNewStaticText ,完整的方法是 //该方法传入两个参数: //1. ParentForm:将这个URLLa ...

  6. P2P 行业解决方案

    P2P指个人与个人之间的借贷,而P2P理财是指以公司为中介机构,把这借贷双方对接起来实现各自的借贷需求.借款方可以是无抵押贷款或是有抵押贷款.而中介一般是收取双方或单方的手续费为盈利目的或者是赚取一定 ...

  7. Python——第一个python程序helloworld

    安装了Python的环境之后,就是编写Python的代码了. 首先,我们来写一个简单的“hello world” 新建一个空白的txt文本,将后缀改为.py 改了后缀之后即变为Python程序的图标 ...

  8. DataGridView 获取当前单元格

    获取DataGridview控件中的当前单元格,是通过DataGridview的Rows属性和Column属性的索引来取得的,他们的索引都是从0开始的. Private void datagridvi ...

  9. 集合框架以及Map(一)

    集合又称容器,编程思想中对其的定义为持有对象 我们在使用集合或者数组时得到最多的异常就是数组下表越界异常 Java.lang.ArrayIndexOutOfBoundsException这篇文章我们不 ...

  10. vi 编辑器使用中常见的命令

    原创作品,转载请在文章头部(显眼位置)注明出处:https://www.cnblogs.com/sunshine5683/p/10014724.html 要在linux学习的路上越走越远,总结是必不可 ...