并行执行计划可以显示为自己的SPID阻塞。这基本上只是等待查询中其他任务完成的线程。死锁是另一个问题,由不同的会议彼此等待引起。死锁(和过度的并行)可能是需要查询和索引调整的一个症状。
如果您正在运行SQL 2008或更高版本,默认情况下system_helath扩展事件跟踪会捕获死锁信息。以下是从环形缓冲区中提取最近死锁信息的查询。这将消除一些猜测。
SELECT
xed.value('@timestamp', 'datetime') as Creation_Date,
xed.query('.') AS Extend_Event
FROM
(
SELECT CAST([target_data] AS XML) AS Target_Data
FROM sys.dm_xe_session_targets AS xt
INNER JOIN sys.dm_xe_sessions AS xs
ON xs.address = xt.event_session_address
WHERE xs.name = N'system_health'
AND xt.target_name = N'ring_buffer'
) AS XML_Data
CROSS APPLY Target_Data.nodes('RingBufferTarget/event[@name="xml_deadlock_report"]') AS XEventData(xed)
ORDER BY Creation_Date DESC;
你怎么知道它是死锁本身?你能描述一下你实际看到的是什么吗? – Blorgbeard 2014-10-02 21:42:12
这不会导致自己的死锁。 – 2014-10-02 21:43:04
如果您在选择数据的同时插入数据库,则可能会将您的查询选为死锁受害者。如果你不关心刚刚插入的数据,你可以在你的表名后添加'nolock',它会做一个“脏”的读取,并且不会发生死锁。 – paqogomez 2014-10-02 21:51:09