在調查阻塞或死鎖時,你可能會遇到等待資源(wait_resource),一般等待的資源是Page或Key:ide
waitresource=「PAGE: 6:3:70133 「
waitresource=「KEY: 6:72057594041991168 (ce52f92a058c)「函數
等待資源的類型是Page或索引鍵,從等待資源能夠探測出,阻塞發生時,競爭的資源究竟是什麼內容。spa
對於等待資源是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資源的格式是 database_id, hobt_id (Magic Hash),其中 Magic Hash的某一個數據行的哈希值:
waitresource=「KEY: 6:72057594041991168 (ce52f92a058c)」 = Database_Id, HOBT_Id ( Magic Hash )
把該等待資源拆分紅三個部分,分別是:
經過視圖 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