Sql-Server

為什麼死鎖圖上有無受害者條目?

  • October 5, 2020

我正在嘗試學習如何分析SQL Server 2008 的死鎖圖,並且我發現了很多帶有空<victim-list>節點的條目。我不明白這些條目代表什麼:如果沒有受害者,我如何辨識導致死鎖的等待資源?這些條目是什麼意思?

這是我看到的條目的一個快速範例:

<deadlock-list>
<deadlock>
 <victim-list />
 <process-list>
  <process id="processd2b6508" taskpriority="0" logused="10000" waittime="31" schedulerid="63" kpid="9104" status="suspended" spid="69" sbid="0" ecid="184" priority="0" trancount="0" lastbatchstarted="2012-07-30T01:10:45.550" lastbatchcompleted="2012-07-30T01:10:45.550" clientapp=".Net SqlClient Data Provider" hostname="XXXXXXX" hostpid="3648" isolationlevel="read committed (2)" xactid="30461033" currentdb="5" lockTimeout="4294967295" clientoption1="671088672" clientoption2="128056">
   <executionStack>
    <frame procname="" line="1" sqlhandle="0x020000002340c50225c17d0eec9bf7c51129348edffd1c70" /> 
    <!--About 2 more frame tags... -->
   </executionStack>
   <inputbuf /> 
  </process>
  <!-- 3 or so more process tags... -->
 </process-list>
 <resource-list>
  <exchangeEvent id="Pipeb005eeba0" WaitType="e_waitPipeNewRow" nodeId="7">
   <owner-list>
    <owner id="processd23fdc8" /> 
   </owner-list>
   <waiter-list>
    <waiter id="processd2b6508" /> 
   </waiter-list>
  </exchangeEvent>
  <!-- 2 more exchangeEvents -->
 </resource-list>
</deadlock>
</deadlock-list>

** 編輯 ** 根據要求,這裡是用於通過它的 sqlhandle 辨識查詢的查詢:

select sql_handle as Handle,
   SUBSTRING(st.text, (qs.statement_start_offset/2)+1, 
       ((CASE qs.statement_end_offset
         WHEN -1 THEN DATALENGTH(st.text)
        ELSE qs.statement_end_offset
        END - qs.statement_start_offset)/2) + 1) AS Text

from sys.dm_exec_query_stats as qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS st
where sql_handle = --0x04000D00E3572A56542E4601CE9E00010100001000000000

來自RyanBoyer.net

ExchangeEvent 和 e_waitPipeNewRow 建議您遇到了 Bart Duncan 所指的煩人且笨拙的術語:“查詢內並行執行緒死鎖”

大多數查詢內並行死鎖被認為是錯誤,儘管其中一些可能是修復的風險錯誤,因此可能無法修復。如果您遇到了一個並且您已經在使用最新的 SQL 服務包,那麼您最好的選擇可能是調查解決方法。

所以,除了:

  • 確保您使用的是最新的服務包和累積更新。
  • 嘗試辨識索引和/或其他優化以提高查詢性能。您提到 inputbuf 未填充,但您可以通過圖形 XML 中的 sqlhandle 辨識正在執行的查詢。如果您沒有從中得到任何結果,請嘗試執行跟踪並與這些死鎖發生的時間相關聯。
  • MAXDOP為此查詢減少或嘗試MAXDOP(1)強制單執行緒執行。請注意,您可能會修復死鎖,但會通過限制並行性引入一組不同的性能問題。
  • 打開與 Microsoft 的支持電話。可能a)他們有針對這種情況的非公開修補程序或b)因為這些查詢內死鎖被認為是他們可能希望與您一起找到修復程序的錯誤。

引用自:https://dba.stackexchange.com/questions/21767