Mengapa ada Entri Tanpa Korban di Deadlock Graph?

11

Saya mencoba mempelajari cara menganalisis grafik kebuntuan SQL Server 2008 , dan saya menemukan banyak entri dengan <victim-list>simpul kosong . Saya tidak mengerti apa yang diwakili entri ini: jika tidak ada korban, bagaimana saya bisa mengidentifikasi sumber waitres yang menyebabkan kebuntuan? Apa artinya entri ini?

Berikut adalah contoh cepat dari entri yang saya lihat:

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

** sunting ** Seperti yang diminta, berikut adalah kueri yang digunakan untuk mengidentifikasi kueri dengan 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

dari RyanBoyer.net

Slider345
sumber
Versi SQL Server saya adalah 10.50.1617.0
Slider345

Jawaban:

9

ExchangeEvent & e_waitPipeNewRow menyarankan Anda bertemu dengan apa yang disebut Bart Duncan sebagai Istilah Menjengkelkan-Berat: "Kebuntuan Utas Paralel Paralel Intra-Kueri" .

Kebanyakan kebuntuan paralelisme intra-kueri dianggap sebagai bug, meskipun beberapa di antaranya dapat menjadi bug berisiko untuk diperbaiki sehingga perbaikan mungkin tidak dapat dilakukan. Jika Anda mengalami salah satunya dan Anda sudah menggunakan paket layanan SQL terbaru, taruhan terbaik Anda adalah menyelidiki penyelesaian masalah.

Jadi, tidak banyak yang bisa Anda lakukan selain:

  • Pastikan Anda menggunakan paket layanan terbaru dan pembaruan kumulatif.
  • Cobalah mengidentifikasi indeks dan / atau optimisasi lain untuk meningkatkan kinerja kueri. Anda menyebutkan bahwa inputbuf tidak terisi tetapi Anda mungkin dapat mengidentifikasi kueri yang sedang dimainkan melalui sqlhandle dalam grafik XML. Jika Anda tidak mendapatkan apa-apa dari itu coba jalankan jejak dan berkorelasi dengan waktu kebuntuan ini terjadi.
  • Kurangi MAXDOPpermintaan ini atau cobalah MAXDOP(1)untuk memaksa eksekusi single-threaded. Ketahuilah bahwa Anda mungkin memperbaiki kebuntuan tetapi memperkenalkan serangkaian masalah kinerja yang berbeda dengan membatasi paralelisme.
  • Buka panggilan dukungan dengan Microsoft. Kemungkinan a) mereka memiliki hotfix non-publik untuk skenario ini atau b) karena kebuntuan intra-kueri ini dianggap sebagai bug yang mungkin ingin mereka kerjakan dengan Anda untuk menemukan perbaikan.
Mark Storey-Smith
sumber