如何在阻塞期间找出associatedObjectId表示的对象?

时间:2014-04-01 21:15:29

标签: sql sql-server-2012

我收到另一个团队关于SQL Server阻止的报告。看结果

  Exec sp_who2

和格伦贝瑞的博客查询

SELECT blocking.session_id AS blocking_session_id
       ,blocked.session_id AS blocked_session_id
       ,waitstats.wait_type AS blocking_resource
       ,waitstats.wait_duration_ms
       ,waitstats.resource_description
       ,blocked_cache.text AS blocked_text
       ,blocking_cache.text AS blocking_text
    FROM sys.dm_exec_connections AS blocking
    INNER JOIN sys.dm_exec_requests blocked
        ON blocking.session_id = blocked.blocking_session_id
    CROSS APPLY sys.dm_exec_sql_text(blocked.sql_handle) blocked_cache
    CROSS APPLY sys.dm_exec_sql_text(blocking.most_recent_sql_handle) blocking_cache
    INNER JOIN sys.dm_os_waiting_tasks waitstats
        ON waitstats.session_id = blocked.session_id

我希望无法捕捉任何被阻挡的东西。多次运行我开始注意到某些东西出现了,但是下次运行查询时,blcoking已经消失了。

我通过SELECT INTO

创建了临时表
       ,blocking_cache.text AS blocking_text
    INTO #TempBlockingTable
    FROM sys.dm_exec_connections AS blocking

将修改后的查询修改为INSERT INTO SELECT。现在,我可以根据需要多次运行查询,而不必担心结果会消失。

我一直运行查询大约10秒钟,直到我最终得到一些结果。

 SELECT * FROM #TempBlockingTable

查看resource_description中的sys.dm_os_waiting_tasks列,我发现数据以下列格式显示。

 <type-specific-description> id=lock<lock-hex-address> mode=<mode> associatedObjectId=<associated-obj-id> 

sys.dm_os_waiting_tasks http://technet.microsoft.com/en-us/library/ms188743.aspx上的Microsoft文档没有associatedObjectId的定义

1 个答案:

答案 0 :(得分:10)

回答实际上是来自Aaron Bertrand在Google网上论坛上发现的。要获取OBJECT_NAME associatedObjectId,您需要运行以下查询

SELECT OBJECT_NAME([object_id])
    FROM sys.partitions
    WHERE partition_id = 456489945132196

此号码456489945132196代表来自associatedObjectId

resource_description列的sys.dm_os_waiting_tasks的值