在 Profiler 生成的跟踪表中,我尝试使用连接到 sys.allocation_units 的列 ObjectID2 来确定锁的来源。
结果并不好。它标识了许多不在生成跟踪的查询上的表。
谁知道那一栏是什么意思?我的 Google-fu 今天让我失望了。
我用来查找对象的基本查询(最后一个没有au.*, p.*
部分):
select object_name(p.object_id) AS name, tt.RowNumber, au.*, p.*
from
Trc_Tables_20131210 tt
INNER JOIN sys.allocation_units au
ON tt.ObjectID2 = au.allocation_unit_id AND tt.ObjectID = 0
INNER JOIN sys.partitions p
ON au.container_id = p.hobt_id
WHERE au.type IN (1,3) AND tt.EventClass = 24
编辑:系统健康是学习的一个很好的迹象。但是现在我必须限制自己使用 SQL 分析器跟踪表来研究查询的锁定,因为我无法轻松访问客户的生产服务器。
关于trace:trace中的主要事件是Lock:Acquired。
对象 ID 实际上是一个分区 ID。这个关于 SO 的问题提供了一个简单的查询来检索所需的信息。
附带说明一下,由于您使用的是 SQL Server 2008 R2,因此我强烈建议您查看包含最近发生的死锁等内容的系统健康会话。根据您的实例的活动,您可能需要按计划提取此信息,因为它是缓冲内存,因此不会在那里停留很长时间。提取此信息比尝试设置跟踪并等待它再次出现要有效得多。
我实际上写了一篇关于这个领域的博客文章,其中包括一个脚本来解析出更易读的信息。博客文章在这里,脚本如下: