Impossibile continuare la scansione con NOLOCK a causa dello spostamento dei dati


10

Eseguiamo SQL Server 2000 e riceviamo alcuni di questi errori ogni notte.

Could not continue scan with NOLOCK due to data movement

La query che genera questo errore è una query complessa di grandi dimensioni che unisce oltre una dozzina di tabelle. I nostri dati sottostanti possono essere aggiornati frequentemente.

La "best practice" culturale è che, in passato, l'introduzione di NOLOCKsuggerimenti ha aumentato le prestazioni e migliorato la concorrenza. Questa query non deve essere accurata al 100%, cioè tollereremo letture sporche ecc. Tuttavia, stiamo lottando per capire perché il database sta generando questo errore, anche se abbiamo tutti questi suggerimenti di blocco.

Qualcuno può far luce su questo - sii gentile, in realtà sono un programmatore, non un DBA :)

PS: abbiamo applicato la correzione di seguito indicata in precedenza: http://support.microsoft.com/kb/815008


3
Vorrei rilasciare il NOLOCK e correggere la query / indici / processo. Naturalmente possiamo aiutarti ... Vedi anche en.wikipedia.org/wiki/Halloween_Problem
gbn

3
@SQLKiwi: SQL 2012 recupera con grazia in molti casi di spostamento dei dati con scansioni sporche (continua nella pagina successiva in ordine di allocazione).
Remus Rusanu,

1
@SQLKiwi: sì, ci sono ancora. Sulla buona notizia: anche i cursori supportati da scansioni sporche dovrebbero gestirlo con più grazia.
Remus Rusanu,

Risposte:


7

Questo è un problema ragionevolmente noto con SQL Server 2000 - essenzialmente, ciò che accade è se una riga viene eliminata dal processo A mentre il processo B sta eseguendo una scansione (in corrispondenza di READ UNCOMMITTEDo WITH (NOLOCK)), quindi il processo B va "eh cosa è successo a questi dati "quando prova a leggerlo. Più precisamente, la riga deve essere eliminata dopo che il processo B ha letto l'indice, ma prima che tenti di leggere la riga di dati.

Craig Freedman scrive bene qui

Fortunatamente, la correzione è relativamente semplice: http://support.microsoft.com/kb/815008

Se ciò non funziona, hai l'opzione leggermente più dolorosa di rimuovere tutti i tuoi WITH (NOLOCK)suggerimenti e impostare il livello di isolamento della transazione su qualcosa sopra READ UNCOMMITTED.


Siamo aggiornati con quella correzione: abbiamo applicato il flag, riavviato e continuiamo a ricevere questi errori.
Ciaran Archer,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.