SQL Server之捕获阻塞事件
在SQL Server 2005之前的版本,分析哪些进程产生阻塞以及哪些进程被阻塞,都需要使用脚本手工执行。现在使用SQL Profiler可以直接监控阻塞的情况,使用SQL Profiler监控哪些进程被阻塞,首先需要确定SQL Trace的事件类,监控阻塞的事件类为Errors and Warnings-Blocked process report,如图所示。
Blocked process report:表示某个任务已被阻塞,导致超过指定的时间,此事件类不包括系统任务和正在等待未发现死锁(non-deadlock-detectable)的资源任务。若要配置报告的频率,请使用 sp_configure 命令配置阻塞的进程阈值选项。
通过sp_configure命令可以重新配置“blocked process threshold”选项的值,单位为秒,但默认情况下并不会显示阻塞进程的具体报告,下面是一个实例,修改默认情况下阻塞进程的报告并将“blocked process threshold”选项的值设置为12,即每12秒钟报告一次阻塞事件,脚本如下:
sp_configure ‘show advanced option’, 1
go
reconfigure
go
sp_configure ‘blocked process threshold’, 12
go
reconfigure
go
sp_configure
运行结果如图所示。
实例:创建一个如图所示的简单的表结构,表名为test。
按上面的配置,创建一个SQL Trace跟踪,之后打开一个查询窗口,执行如下更新的脚本:
begin tran
update TEST
set name = ‘abc123’
where id = 1
再打开第二个查询窗口,执行查询操作,查询的是同一行数据,脚本如下:
select *
from test
where id = 1
由于第一个查询窗口中开始了一个事务并且一直没有将该事务关闭,所以导致第二个查询语句脚本阻塞,如果出现阻塞,SQL Profiler会每隔10秒报告一次阻塞事件的情况,跟踪的结果如图所示。
该报告是以XML的格式显示,在该报告中详细的显示产生阻塞的进程以及被阻塞的进程。