SQL Server: menemui jalan buntu pada sumber daya buffer komunikasi kunci

30

Apa yang mungkin menjadi alasan untuk jenis kebuntuan ini? (tidak menemui jalan buntu)

Kunci sumber daya buffer komunikasi

Apakah sistem yang ditunjukkan ini memiliki memori rendah dan jumlah buffer kehabisan batas?

Kesalahan Rinci:

Transaksi (ID Proses 59) menemui jalan buntu pada sumber daya buffer komunikasi kunci dengan proses lain dan telah dipilih sebagai korban deadlock. Jalankan kembali transaksi

Shawn Melton
sumber

Jawaban:

24

Pesan lengkap yang umum dilihat:

Transaksi (ID Proses 53) menemui jalan buntu pada kunci | sumber daya penyangga komunikasi dengan proses lain dan telah dipilih sebagai korban kebuntuan. Jalankan kembali transaksi.

Jenis kunci ini biasanya dilihat dengan kueri kebuntuan yang telah dieksekusi oleh SQL Server sebagai paralel, kadang-kadang disebut sebagai "deadlock paralel intra-kueri". Saya telah melihat beberapa pernyataan bahwa ini juga menunjukkan sumber daya sistem rendah, yang saya kira bisa terlibat sedikit.

Pedoman umum yang saya perhatikan untuk menentukan apakah itu deadlock paralel adalah ketika Anda menarik grafik deadlock XML (yang dapat dilakukan dengan sesi system_health pada 2008 dan lebih tinggi), Anda akan melihat ID proses yang berbeda menunjukkan sedikit kode yang sama dalam tumpukan eksekusi.

Juga, melihat daftar sumber daya dari grafik kebuntuan dan mencatat jenis acara pelayan. Biasanya mereka akan menampilkan "e_xxxxxx", atau sesuatu seperti ini mungkin:

<waiter-list>
 <waiter event="e_waitPipeGetRow" type="consumer" id="process821d828" />
 <waiter event="e_waitPipeGetRow" type="consumer" id="process8209198" />
 <waiter event="e_waitPipeGetRow" type="consumer" id="process3827c18" />
 <waiter event="e_waitPipeGetRow" type="consumer" id="process3809eb8" />
 <waiter event="e_waitPipeGetRow" type="consumer" id="process8226b08" />
 <waiter event="e_waitPipeGetRow" type="consumer" id="process9acb6d8" />
 <waiter event="e_waitPipeGetRow" type="consumer" id="process6188d7828" />
 <waiter event="e_waitPipeGetRow" type="consumer" id="process381cef8" />
</waiter-list>

Untuk mencoba dan menyelesaikan masalah, berbagai jalur untuk diambil ditawarkan secara online dan dalam buku. Saya biasanya mulai dengan melihat rencana eksekusi permintaan / prosedur dan fokus pada area yang menunjukkan eksekusi paralel. Kemudian dari sana pergi melalui mencoba untuk menyetel kueri terlebih dahulu dan kemudian sebagai upaya terakhir dapat mulai menggunakan petunjuk kueri.

Petunjuk kueri paling umum yang akan Anda lihat disebutkan untuk menyelesaikan kebuntuan ini adalah penerapan MAXDOP 1. Namun, sebelum melakukan itu, Anda mungkin memeriksa untuk melihat apa yang ditetapkan pada tingkat server MAXDOP dan Batas Biaya. Ambang Biaya umumnya ditetapkan ke 5 secara default dan saya ingin menaikkannya menjadi 35 atau 40 sebagai permulaan, jika kueri yang dimaksud memiliki biaya rendah untuk bagian kode itu, mungkin tidak perlu berjalan secara paralel sama sekali. Saya tidak terlalu suka menggunakan petunjuk kueri MAXDOP tetapi itu tidak berarti mereka tidak memiliki tempat dan tujuan. hanya pendapat saya.

Shawn Melton
sumber