Sql-Server
如何找出 sys.dm_tran_locks 中的 KEY 或 PAGE 或 EXTENT 鎖屬於哪個表/對象?
當我查詢
sys.dm_tran_locks
時,會出現幾個問題:
resource_type
我可以看到在 KEY、PAGE、EXTENT、RID 級別(列)放置了一些鎖。如何找出這些特定的鍵、頁面、範圍、rids 屬於哪個表或對象?- 對於 OBJECT 級別的鎖 (
resource_type = 'OBJECT'
) - 定義對象名稱的正確方法是什麼?resource_associated_entity_id
列是object_id
對象的嗎?還是有一些警告?- 一些對像有
resource_associated_entity_id = -1261057897
(負數) - 如何找出這些對象的名稱?
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;
- 是
resource_associated_entity_id
的object_id
,當 resource_type 為 時,是OBJECT
。對於其他資源類型,它將引用其他類型的標識符,例如rowset_id
或allocation_unit_id
。這就是為什麼不簡單地命名該列的原因object_id
。SELECT OBJECT_NAME(object_id);
將返回對象名稱,無論object_id
是負數還是正數。#temp 表具有負值object_id
,例如,在 SQL Server 2012 及更高版本中,實際上並不能保證任何object_id
值都是正值。