SQL捕捉blocking信息
场景:
客户抱怨数据库慢,但是回去看的时候,可能已经不慢了,为了查出当时到底是什么原因导致数据慢,制作了下面的存储过程,然后每隔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信息的更多相关文章
- 如何有效抓取SQL Server的BLOCKING信息
原文:如何有效抓取SQL Server的BLOCKING信息 转自:微软亚太区数据库技术支持组 官方博客 http://blogs.msdn.com/b/apgcdsd/archive/2011/12 ...
- SQL查询数据库信息, 数据库表名, 数据库表信息
SQL查询数据库信息, 数据库表名, 数据库表信息 ---------------------------------------------- -- 以下例子, 在sql_server 中可以直接运 ...
- 使用ttXactAdmin、ttSQLCmdCacheInfo、ttSQLCmdQueryPlan获取SQL相关具体信息[TimesTen运维]
使用ttXactAdmin.ttSQLCmdCacheInfo.ttSQLCmdQueryPlan获取SQL相关具体信息,适合于tt11以上版本号. $ ttversion TimesTen Rele ...
- 使用SQLdiag Utility搜集SQL Server诊断信息
SQLdiag Utility用于搜集诊断信息,给Microsoft技术支持人员做为判断依据. 使用SQLdiag 会进行信息搜集类型 Windows 系统性能日志 Windows 系统日志 SQL ...
- 查询某库所有表的rows &查看当前sql的注册信息
查询某库所有表的rows &查看当前sql的注册信息 1 2 3 4 5 6 7 select sobj.name,spar.rows FROM sys.objects sobj INNER ...
- 将SQL获取的信息传递到Email中
将SQL获取的信息传递到Email中 最近在为公司财务开发一个邮件通知时遇到了一个技术问题.原来我设计SSIS的是每天将ERP系统支付数据导出到财务支付平台后 Email 通知财务,然后财务到支付平台 ...
- 全废话SQL Server统计信息(2)——统计信息基础
接上文:http://blog.csdn.net/dba_huangzj/article/details/52835958 我想在大地上画满窗子,让所有习惯黑暗的眼睛都习惯光明--顾城<我是一个 ...
- 全废话SQL Server统计信息(1)——统计信息简介
当心空无一物,它便无边无涯.树在.山在.大地在.岁月在.我在.你还要怎样更好的世界?--张晓风<我在> 为什么要写这个内容? 随着工作经历的积累,越来越感觉到,大量的关系型数据库的性能问题 ...
- 【原创】大叔经验分享(18)hive2.0以后通过beeline执行sql没有进度信息
一 问题 在hive1.2中使用hive或者beeline执行sql都有进度信息,但是升级到hive2.0以后,只有hive执行sql还有进度信息,beeline执行sql完全silence,在等待结 ...
随机推荐
- 利用setTimeout来实现setInterval
在Js中,当我们要在一定间隔时间内不断执行同一函数,我们可以使用setInterval函数,但setInterval在某些情况下使用时也存在一定问题. 1.不去关心回调函数是否还在运行 在某些情况下, ...
- Scope of a Declaration
6.3. Scope of a Declaration The scope of a declaration of a member m declared in or inherited by an ...
- AutoMapper控件
1.下载AutoMapper控件. 2.定义类,实现Profile. 3.在定义类的构造方法中使用如下代码进行转换 // 1.匹配,o,t代表TDestination;s代表TSource,返回TDe ...
- Struts1原理解析
1.浏览器发送http请求->web服务器. 2.web服务器将 请求进行解析. 3.web服务器解析后将请求转发给ActionServelet(总队长). 3.查询struts-config. ...
- Android组件--意图(Intent)
1. 隐示调用和显示调用 参考资料:http://blog.csdn.net/harvic880925/article/details/38399723 1.概念 1). 显式意图: 能从intent ...
- MySQL字符串函数:字符串截取
MySQL 字符串截取函数:left(), right(), substring(), substring_index().还有 mid(), substr().其中,mid(), substr() ...
- C《二》
开始阅读谭浩强的C语言程序设计. 编译一个程序,除了语法以外,还需要管理内存,就是数据结构,学习如何高效的利用内存:数据关系的处理.例如学生管理系统的开发,但是数据关系是有最优解的,也就是可以学会的, ...
- 配置内核源码make menuconfig时出现 #include CURSES_LOC错误
配置内核时出现如下错误: liuxin@sunshine-virtual-machine:~/work/nfs_root/system/linux-2.6.22.6$ make menuconfig ...
- Hadoop源码学习笔记(6)——从ls命令一路解剖
Hadoop源码学习笔记(6) ——从ls命令一路解剖 Hadoop几个模块的程序我们大致有了点了解,现在我们得细看一下这个程序是如何处理命令的. 我们就从原头开始,然后一步步追查. 我们先选中ls命 ...
- jenkins在Linux 下安装部署
这里介绍两种方法,一种方法将最新版jenkins加入到yum源,另外一种是下载指定版本的rpm包 系统centos6 自带jdk1.7 一 安装jenkins wget -O :下载并以不同的文件 ...