在调查阻塞或死锁时,你可能会遇到等待资源(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