在SQLServer2005之前,从不同的来源可以得到很多可用的脚本,来捕获哪些数据库进程产生 阻塞 以及哪些进程被 阻塞 。然而,这些脚本需要手工执行。sp_blocker就是一个实例。 然而,我们可以 利用 Sql Server Profiler ,来自动的捕获被 阻塞 的进程。要用Sql
在SQLServer2005之前,从不同的来源可以得到很多可用的脚本,来捕获哪些数据库进程产生 阻塞 以及哪些进程被 阻塞 。然而,这些脚本需要手工执行。sp_blocker就是一个实例。
然而,我们可以 利用 Sql Server Profiler ,来自动的捕获被 阻塞 的进程。要用Sql Server Profiler捕获这些进程,我们需要用到Sql Server Profiler 的Blocked Process Report 事件 。
.Blocked Process Report: 这表示一个任务被 阻塞 的时间已经超出了特定时间长度。这个 事件 类不包含系统任务或等待非死锁可检测(non-deadlock-detectable)资源的任务。
为了配置Sql Server Profiler,我们必须在SqlServer中为捕获 阻塞 事件 配置一个阈值。
现在我通过一个例子来实现, 利用 Sql Profiler 捕捉 阻塞 事件 :
一.配置Blocked Process Report
1.打开Sql Server Profiler工具 如图:
2.新建跟踪 如图:
3.选择要跟踪的数据实例,如图:
4.选择跟踪模板,为空白,如图:
5.选择Blocked Process Report 事件 ,如图:
为了配置阈值及生产报表的频度,可使用sp_configure命令来配置Blocked Process Report选项,默认情况下是不产生 阻塞 进程报表的。在代码实例中,Blocked Process Report配置为5秒钟报告一次 阻塞 事件 ,配置之后,再次执行sp_configure验证是否配置成功:
-- 首先执行以下语句配置 sp_configure ' show advanced options ' , 1 GO RECONFIGURE GO sp_configure ' blocked process threshold ' , 5 GO RECONFIGURE GO -- 然后再执行 sp_configure
如上图,出现如红色的行,证明配置成功了。
二.通过示例里数据库PerformanceDB来实现 阻塞 事件 做个实验。
我们为实验开两个查询窗口:
1.第一个窗口中,执行如下UPDATE语句,这段代码有意令事务保持打开,从而可以触发 阻塞 事件 。
USE PerformanceDB BEGIN TRAN UPDATE dbo.Orders_new SET EmpID = 445 ,Filler= ' b ' WHERE orderId= 430
2.第二个窗口中,执行相同条件的数据行。由于数据已经被UPDATE 事务 阻塞 ,因此这个查询将会被 阻塞
SELECT * FROM dbo.Orders_new WHERE orderId= 430
但满足 阻塞 事件 的阈值(在sp_configuer中为5秒)之后,Sql Profiler 会自动捕获每个 阻塞 事件 。对于Sql Profiler中捕获的每个 阻塞 事件 ,Sql Profiler为 阻塞 者记录下执行语句,它会精确的定位哪个进程是 阻塞 者以及哪个进程被 阻塞 。这些数据会以XML格式显示,如图(会5秒钟 捕捉 一次):
配置Sql Profiler来 捕捉 阻塞 事件 ,使得 性能 监视以及调校任务比以前容易了很多,我们测量 阻塞 事件 的发生频度以及每天发生的 阻塞 事件 数目,将会提供 性能 数据的定量检测。
查看更多关于SqlServer2005性能调校之利用SqlServerProfiler捕捉阻塞事件的详细内容...