Saya memiliki proses dengan Select yang membutuhkan waktu lama untuk menyelesaikannya, dengan urutan 5 hingga 10 menit.
Saat ini saya tidak menggunakan NOLOCK sebagai petunjuk untuk mesin database MS SQL.
Pada saat yang sama kami memiliki proses lain yang melakukan pembaruan dan memasukkan ke dalam database yang sama dan tabel yang sama.
Proses pertama telah dimulai, baru-baru ini diakhiri dengan pesan sebelum waktunya
SQLEXCEPTION: Transaksi menemui jalan buntu pada sumber daya kunci dengan proses lain dan telah dipilih sebagai korban kebuntuan.
Proses pertama ini berjalan di situs lain dalam kondisi yang sama tetapi dengan database yang lebih kecil dan dengan demikian pernyataan pemilihan yang dimaksud membutuhkan waktu yang lebih singkat (sekitar 30 detik atau lebih). Di situs lain ini, saya tidak mendapatkan pesan kebuntuan di situs lain tersebut. Saya juga tidak mendapatkan pesan ini di situs yang pada awalnya mengalami masalah, tetapi, saya berasumsi, karena database telah berkembang, saya yakin saya pasti telah melewati beberapa ambang batas. Inilah pertanyaan saya:
- Mungkinkah waktu yang diperlukan untuk mengeksekusi transaksi membuat proses terkait lebih mungkin ditandai sebagai korban jalan buntu.
- Jika saya menjalankan pemilihan dengan petunjuk NOLOCK, apakah ini akan menghilangkan masalah?
- Saya menduga bahwa bidang datetime yang diperiksa sebagai bagian dari klausa WHERE dalam pernyataan pilih menyebabkan waktu pencarian yang lambat. Dapatkah saya membuat indeks berdasarkan bidang ini? Apakah itu dianjurkan?
sumber
Jawaban:
Tidak. SELECT menjadi korban karena hanya membaca data, oleh karena itu transaksi memiliki biaya yang lebih rendah terkait dengannya sehingga dipilih sebagai korban:
Tidak. Karena beberapa alasan:
Mungkin. Penyebab kebuntuan hampir kemungkinan besar adalah database yang diindeks dengan buruk. Kueri 10 menit dapat diterima dalam kondisi yang begitu sempit, sehingga saya 100% yakin dalam kasus Anda tidak dapat diterima.
Dengan keyakinan 99% saya menyatakan bahwa kebuntuan Anda disebabkan oleh pemindaian tabel besar yang bertentangan dengan pembaruan. Mulailah dengan menangkap grafik kebuntuan untuk menganalisis penyebabnya. Anda kemungkinan besar harus mengoptimalkan skema database Anda. Sebelum Anda melakukan modifikasi apa pun, baca topik Mendesain Indeks dan sub-artikel ini.
sumber
Berikut adalah bagaimana masalah kebuntuan ini benar-benar terjadi dan bagaimana itu sebenarnya diselesaikan. Ini adalah database yang cukup aktif dengan 130 ribu transaksi yang terjadi setiap hari. Indeks dalam tabel di database ini awalnya berkerumun. Klien meminta kami untuk membuat indeks menjadi nonclustered. Segera setelah kami melakukannya, kebuntuan dimulai. Saat kami menetapkan kembali indeks sebagai berkerumun, kebuntuan berhenti.
sumber
Jawabannya di sini patut dicoba, tetapi Anda juga harus meninjau kode Anda. Secara khusus, baca jawaban Polyfun di sini: Bagaimana cara menghilangkan kebuntuan di aplikasi SQL Server 2005 dan C #?
Ini menjelaskan masalah konkurensi, dan bagaimana penggunaan "with (updlock)" dalam kueri Anda dapat memperbaiki situasi deadlock Anda - bergantung pada apa yang sebenarnya dilakukan kode Anda. Jika kode Anda mengikuti pola ini, kemungkinan besar ini adalah perbaikan yang lebih baik, sebelum beralih ke bacaan kotor, dll.
sumber
Meskipun @ Remus Rusanu 's sudah jawaban Excellent, dalam satu kasus adalah melihat ke depan wawasan yang lebih baik pada SQL Server Deadlock menyebabkan dan strategi jejak, saya akan menyarankan Anda untuk membaca Brad McGehee ' s Cara Melacak Deadlock Menggunakan SQL Server 2005 Profiler
sumber