2011-10-19 10 views
12

パフォーマンス問題が発生しているときに私のデータベースのどの領域がロックしているかを確認するにはsys.dm_tran_locksビューを使用しています。このビューを使用してページロックがどのテーブルに属しているかを調べる方法

....

  • RESOURCE_TYPEは、私がロックを持っているもののデータベースを見つけるためにDB_NAME関数を使用することができますデータベースある場合。

  • もしもオブジェクト私は通常、それがどのテーブルであるかを調べるためにsys.tablesに参加することができます。

しかしRESOURCE_TYPEがページまたはキー私はテーブルがロックされているのは良いアイデアを得ることができるように、親テーブルにこのバックを追跡する方法がある場合はどうなるでしょうか?

答えて

30

これはresource_associated_entity_id列が(Example query)のものです。

SELECT dm_tran_locks.request_session_id, 
     dm_tran_locks.resource_database_id, 
     DB_NAME(dm_tran_locks.resource_database_id) AS dbname, 
     CASE 
      WHEN resource_type = 'OBJECT' 
       THEN OBJECT_NAME(dm_tran_locks.resource_associated_entity_id) 
      ELSE OBJECT_NAME(partitions.OBJECT_ID) 
     END AS ObjectName, 
     partitions.index_id, 
     indexes.name AS index_name, 
     dm_tran_locks.resource_type, 
     dm_tran_locks.resource_description, 
     dm_tran_locks.resource_associated_entity_id, 
     dm_tran_locks.request_mode, 
     dm_tran_locks.request_status 
FROM sys.dm_tran_locks 
LEFT JOIN sys.partitions ON partitions.hobt_id = dm_tran_locks.resource_associated_entity_id 
LEFT JOIN sys.indexes ON indexes.OBJECT_ID = partitions.OBJECT_ID AND indexes.index_id = partitions.index_id 
WHERE resource_associated_entity_id > 0 
    AND resource_database_id = DB_ID() 
ORDER BY request_session_id, resource_associated_entity_id 
1

このリソースに関連付けられているobject_idを見つける必要があり、別のテーブルに参加する必要があります。たとえば、

SELECT *, OBJECT_NAME(p.object_id) 
FROM sys.dm_tran_locks l  
JOIN sys.partitions p 
ON l.resource_associated_entity_id = p.hobt_id 
WHERE resource_type = 'KEY' 

オンラインでBooks.dm_tran_locksを参照して、各リソースの結合テーブルを調べる必要があります。

関連する問題