Sql-Server

如何找出 sys.dm_tran_locks 中的 KEY 或 PAGE 或 EXTENT 鎖屬於哪個表/對象?

  • August 15, 2019

當我查詢sys.dm_tran_locks時,會出現幾個問題:

  1. resource_type我可以看到在 KEY、PAGE、EXTENT、RID 級別(列)放置了一些鎖。如何找出這些特定的鍵、頁面、範圍、rids 屬於哪個表或對象?
  2. 對於 OBJECT 級別的鎖 ( resource_type = 'OBJECT') - 定義對象名稱的正確方法是什麼?resource_associated_entity_id列是object_id對象的嗎?還是有一些警告?
  3. 一些對像有resource_associated_entity_id = -1261057897(負數) - 如何找出這些對象的名稱?
  1. sys.dm_db_database_page_allocations()專門引入以避免使用不受支持和未記錄的命令(如DBCC IND和)自己進行任何此類探索DBCC PAGE。在本技巧中,我談到了一個更好的替代品,即將出現在 SQL Server 2019 中。需要注意的是,這是一個非常昂貴的查詢,您可能希望進一步過濾它以將輸出限制為sys.dm_tran_locks您正在調查的特定行:
SELECT OBJECT_SCHEMA_NAME(p.object_id), OBJECT_NAME(p.object_id), * 
FROM sys.dm_tran_locks AS t
INNER JOIN sys.dm_db_database_page_allocations(DB_ID(),NULL,NULL,NULL,'LIMITED') AS p
ON t.resource_associated_entity_id = CASE 
 WHEN resource_type = N'OBJECT' THEN p.object_id
 WHEN resource_type IN (N'KEY',N'PAGE',N'RID') THEN p.rowset_id 
 -- not quite sure about EXTENT
END
WHERE OBJECTPROPERTY(p.object_id, 'IsMsShipped') = 0;
  1. resource_associated_entity_idobject_id,當 resource_type 為 時,是OBJECT。對於其他資源類型,它將引用其他類型的標識符,例如rowset_idallocation_unit_id。這就是為什麼不簡單地命名該列的原因object_id
  2. SELECT OBJECT_NAME(object_id);將返回對象名稱,無論object_id是負數還是正數。#temp 表具有負值object_id例如,在 SQL Server 2012 及更高版本中,實際上並不能保證任何object_id值都是正值。

引用自:https://dba.stackexchange.com/questions/245423