並行執行計劃可以顯示爲自己的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