为什么死锁图上有无害条目?


11

我正在尝试学习如何分析SQL Server 2008的死锁图,并且发现了大量带有空<victim-list>节点的条目。我不明白这些条目代表什么:如果没有受害者,我如何确定导致死锁的waitresource?这些条目是什么意思?

这是我看到的条目的快速示例:

<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


我的SQL Server版本是10.50.1617.0
Slider345

Answers:


9

ExchangeEvent和e_waitPipeNewRow建议您也碰到Bart Duncan所说的烦人且笨拙的术语:“查询内并行线程死锁”

大多数查询内并行死锁都被视为错误,尽管其中一些死锁可能是有风险的错误,因此可能无法修复。如果您碰巧遇到了麻烦,并且已经在使用最新的SQL Service Pack,那么最好的选择就是研究解决方法。

因此,除了:

  • 确保您使用的是最新的Service Pack和累积更新。
  • 尝试识别索引和/或其他优化以提高查询性能。您提到没有填充inputbuf,但是您可以通过图形XML中的sqlhandle识别正在使用的查询。如果您从中没有得到任何帮助,请尝试运行跟踪并与发生这些死锁的时间建立关联。
  • 减少MAXDOP此查询的次数或尝试MAXDOP(1)强制执行单线程。请注意,您可能会解决死锁,但通过限制并行性会引入一系列不同的性能问题。
  • 与Microsoft打开支持电话。可能是a)对于这种情况他们有一个非公开的修补程序,或者b)这些查询内的死锁被认为是它们可能希望与您一起找到修复程序的错误。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.