Tidak dapat melanjutkan pemindaian dengan NOLOCK karena perpindahan data


10

Kami menjalankan SQL Server 2000 dan kami mendapatkan beberapa kesalahan ini setiap malam.

Could not continue scan with NOLOCK due to data movement

Kueri yang melempar kesalahan ini adalah kueri kompleks besar yang bergabung dengan lebih dari selusin tabel. Data dasar kami dapat sering diperbarui.

'Praktik terbaik' budaya adalah, di masa lalu, pengenalan NOLOCKpetunjuk meningkatkan kinerja dan meningkatkan konkurensi. Kueri ini tidak harus 100% akurat, yaitu kami akan mentolerir pembacaan yang kotor dll. Namun, kami berjuang untuk memahami mengapa database melempar kesalahan ini, meskipun kami memiliki semua petunjuk penguncian ini.

Adakah yang bisa menjelaskan ini - lembut, saya sebenarnya seorang programmer, bukan DBA :)

PS: Kami telah menerapkan perbaikan yang disebutkan di bawah ini sebelumnya: http://support.microsoft.com/kb/815008


3
Saya akan menjatuhkan NOLOCK dan memperbaiki kueri / indeks / proses. Tentu saja kami dapat membantu ... Juga lihat en.wikipedia.org/wiki/Halloween_Problem
gbn

3
@SQLKiwi: SQL 2012 pulih dengan anggun dalam banyak kasus perpindahan data di bawah pemindaian kotor (berlanjut di halaman berikutnya dalam urutan alokasi).
Remus Rusanu

1
@ SQLKiwi: ya, masih ada. Pada berita baiknya: juga kursor yang didukung oleh pemindaian kotor harus menangani ini dengan lebih anggun.
Remus Rusanu

Jawaban:


7

Ini adalah masalah yang cukup terkenal dengan SQL Server 2000 - pada dasarnya, apa yang terjadi adalah jika sebuah baris dihapus oleh proses A saat proses B sedang melakukan pemindaian (baik pada READ UNCOMMITTEDatau WITH (NOLOCK)), maka proses B berjalan "ya apa yang terjadi pada data ini "Ketika mencoba membacanya. Lebih tepatnya, baris harus dihapus setelah proses B membaca indeks, tetapi sebelum mencoba membaca baris data.

Craig Freedman memberikan tulisan yang bagus di sini

Untungnya, perbaikannya relatif sederhana: http://support.microsoft.com/kb/815008

Jika itu tidak berhasil, Anda memiliki opsi yang sedikit lebih menyakitkan untuk menghapus semua WITH (NOLOCK)petunjuk Anda dan mengatur tingkat isolasi transaksi Anda ke sesuatu di atas READ UNCOMMITTED.


Kami mutakhir dengan perbaikan itu - kami menerapkan bender, memulai kembali dan kami masih mendapatkan kesalahan ini.
Ciaran Archer
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.