在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來捕捉阻塞事件,使得性能監視以及調校任務比以前容易了很多,我們測量阻塞事件的發生頻度以及每天發生的阻塞事件數目,將會提供性能數據的定量檢測。