Warum gibt es opferlose Einträge im Deadlock-Diagramm?

11

Ich versuche zu lernen, wie das Deadlock-Diagramm von SQL Server 2008 analysiert wird , und finde viele Einträge mit einem leeren <victim-list>Knoten. Ich verstehe nicht, was diese Einträge darstellen: Wenn es kein Opfer gibt, wie kann ich die Waitresource identifizieren, die den Deadlock verursacht? Was bedeuten diese Einträge?

Hier ist ein kurzes Beispiel für die Einträge, die ich sehe:

<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>

** Bearbeiten ** Wie angefordert, wird hier die Abfrage verwendet, um eine Abfrage anhand ihres SQL-Handles zu identifizieren:

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

von RyanBoyer.net

Slider345
quelle
Meine Version von SQL Server ist 10.50.1617.0
Slider345

Antworten:

9

ExchangeEvent & e_waitPipeNewRow schlägt vor, dass Sie auf das stoßen, was Bart Duncan auch als ärgerlich unhandlichen Begriff bezeichnet: "Intra-Query Parallel Thread Deadlocks" .

Die meisten Deadlocks für Parallelität innerhalb von Abfragen werden als Fehler betrachtet, obwohl einige von ihnen riskante Fehler bei der Behebung sein können, sodass eine Behebung möglicherweise nicht möglich ist. Wenn Sie auf eines stoßen und bereits über das neueste SQL Service Pack verfügen, sollten Sie die Problemumgehungen am besten untersuchen.

Sie können also nicht viel anderes tun als:

  • Stellen Sie sicher, dass Sie über das neueste Service Pack und das neueste kumulative Update verfügen.
  • Versuchen Sie, Indizes und / oder andere Optimierungen zu identifizieren, um die Leistung der Abfrage zu verbessern. Sie erwähnen, dass inputbuf nicht ausgefüllt ist, aber Sie können die im Spiel befindliche Abfrage möglicherweise über das sqlhandle im XML-Diagramm identifizieren. Wenn Sie davon nichts erhalten, versuchen Sie, einen Trace auszuführen und mit den Zeiten zu korrelieren, zu denen diese Deadlocks auftreten.
  • Reduzieren Sie MAXDOPdiese Abfrage oder versuchen Sie MAXDOP(1), die Ausführung mit einem Thread zu erzwingen. Beachten Sie, dass Sie möglicherweise die Deadlocks beheben, aber andere Leistungsprobleme einführen, indem Sie die Parallelität einschränken.
  • Öffnen Sie einen Supportanruf bei Microsoft. Möglicherweise haben sie a) einen nicht öffentlichen Hotfix für dieses Szenario oder b) da diese Deadlocks innerhalb der Abfrage als Fehler angesehen werden, möchten sie möglicherweise mit Ihnen zusammenarbeiten, um einen Fix zu finden.
Mark Storey-Smith
quelle