[SQL SERVER]找出封鎖的處理序

[SQL SERVER]找出封鎖的處理序

今年4月中系統上線第一天因為suspended相當高,

這篇介紹透過 blocked process threshold 組態來找出blocked process兇手。

 

1.啟用並設定10秒門檻值

sp_configure 'show advanced options', 1 ;
GO
RECONFIGURE ;
GO
sp_configure 'blocked process threshold', 10;
GO
RECONFIGURE ;
GO

只要封鎖超過10秒就會觸發 Blocked Process Report Event Class,但需注意該值建議要>=5,

因為1~4會造成死結監控處理序不斷執行,而且該值也不建議長久啟用。

 

2.啟用server trace

可參考[SQL SERVER][Maintain]匯出指令碼追蹤定義產生如下script

image

選擇Blocked process report event。

 

image

修改檔案路徑和停止時間並啟動trace。

 

3.模擬blocked process

session1

select * from DDTest

 

session2

begin tran

update DDTest set col1 = 100 + 1
waitfor delay '00:00:15'

rollback

 

4.停止trace

--停止trace
exec sp_trace_setstatus 2, 0
--刪除trace但保留檔案
exec sp_trace_setstatus 2, 2

 

5.View blocked process report(記得停用trace  exec sp_trace_setstatus 2, 0)

可以參考[SQL SERVER][Maintain]如何把追蹤檔(trc)匯入資料表

我這裡直接查詢trace file

select SPID,cast(TextData as xml),EndTime, Duration
from fn_trace_gettable(N'e:\findblocked.trc', default)
where eventclass = 137

image

 

我們來看一下輸出的xml檔案是否有如實抓到

image

可以明確看到相關SQL Statement都有詳細資訊,spid52 等待資源OBJECT: 7:1892201791:0。

 

最後停用 sp_configure 'blocked process threshold' ,0

 

 

 

 

參考

blocked process threshold Server Configuration Option

Increase or Disable Blocked Process Threshold

Blocked Process Report Event Class

SQL SERVER – Find Blocking Using Blocked Process Threshold

Locking and Blocking in SQL Server

Blocked Process Threshold – sp_configure