等待資源(wait_resource)解碼

在調查阻塞或死鎖時,你可能會遇到等待資源(wait_resource),一般等待的資源是Page或Key:ide

waitresource=「PAGE: 6:3:70133 「
waitresource=「KEY: 6:72057594041991168 (ce52f92a058c)「函數

等待資源的類型是Page或索引鍵,從等待資源能夠探測出,阻塞發生時,競爭的資源究竟是什麼內容。spa

一,等待資源是PAGE

對於等待資源是PAGE的狀況,PAGE的格式是 Database_Id : File_Id : PageNumber,以下所示:code

waitresource=「PAGE: 6:3:70133 」 = Database_Id : FileId : PageNumberorm

每一個Page的Header中都包含所屬的table對象的信息,據此能夠查詢出競爭的資源是哪個表的數據頁。對象

1,查看Page Header的信息blog

根據以上信息,能夠使用DBCC PAGE來查看page header的信息:索引

DBCC TRACEON (3604);
GO
/* DBCC PAGE (DatabaseName, FileNumber, PageNumber, DumpStyle)*/
DBCC PAGE ('WideWorldImporters',3,70133,2);
GO

比較重要的字段是:ObjectID 和 IndexId 字段,以下圖所示:資源

2,查看Page的內容文檔

根據DBCC PAGE返回的內容,能夠使用 %%physloc%% 來查看Page上數據行的定位器。在Page上,每個數據行均可以經過一個索引來尋址,該索引就是數據行的定位器。

SELECT 
    sys.fn_PhysLocFormatter (%%physloc%%) AS PhysLoc,
    *
FROM table WITH(NOLOCK)
WHERE sys.fn_PhysLocFormatter (%%physloc%%) like '(3:70133%'

二,等待資源是Key

對於等待的資源是Key的狀況,Key資源的格式是 database_id, hobt_id (Magic Hash),其中 Magic Hash的某一個數據行的哈希值:

 waitresource=「KEY: 6:72057594041991168 (ce52f92a058c)」 = Database_Id, HOBT_Id ( Magic Hash )

把該等待資源拆分紅三個部分,分別是:

  • database_id = 6
  • hobt_id = 72057594041991168
  • magic hash value = (ce52f92a058c)

經過視圖 sys.partitions 來查看hobt_id對應的object_id,使用%%lockres%% 來解碼 Magic Hash。

若是想知道具體鎖定的數據行,能夠使用%%lockres%%函數來找到對應的數據行。

SELECT *
FROM table WITH(NOLOCK)
WHERE %%lockres%% = '(ce52f92a058c)';

 

 

參考文檔:

Decoding Key and Page WaitResource for Deadlocks and Blocking

相關文章
相關標籤/搜索