Der Scanvorgang mit NOLOCK konnte aufgrund von Datenverschiebungen nicht fortgesetzt werden

10

Wir führen SQL Server 2000 aus und erhalten jede Nacht einige dieser Fehler.

Could not continue scan with NOLOCK due to data movement

Die Abfrage, die diesen Fehler auslöst, ist eine große komplexe Abfrage, die über ein Dutzend Tabellen verknüpft. Unsere zugrunde liegenden Daten können häufig aktualisiert werden.

Die kulturelle „Best Practice“ besteht darin, dass in der Vergangenheit durch die Einführung von NOLOCKHinweisen die Leistung gesteigert und die Parallelität verbessert wurde. Diese Abfrage muss nicht 100% genau sein, dh wir tolerieren Dirty Reads usw. Wir haben jedoch Schwierigkeiten zu verstehen, warum die Datenbank diesen Fehler auslöst, obwohl wir alle diese Sperrhinweise haben.

Kann jemand etwas Licht ins Dunkel bringen - sei sanft, ich bin eigentlich ein Programmierer, kein DBA :)

PS: Wir haben den unten genannten Fix angewendet: http://support.microsoft.com/kb/815008

Ciaran Archer
quelle
3
Ich würde den NOLOCK löschen und die Abfrage / Indizes / Prozesse korrigieren. Wir können natürlich helfen ... Siehe auch en.wikipedia.org/wiki/Halloween_Problem
gbn
3
@SQLKiwi: SQL 2012 wird in vielen Fällen der Datenverschiebung unter schmutzigen Scans ordnungsgemäß wiederhergestellt (wird auf der nächsten Seite in der Zuordnungsreihenfolge fortgesetzt).
Remus Rusanu
1
@ SQLKiwi: Ja, es gibt noch. Zu den guten Nachrichten: Auch Cursor, die von schmutzigen Scans unterstützt werden, sollten dies eleganter handhaben.
Remus Rusanu

Antworten:

7

Dies ist ein ziemlich bekanntes Problem mit SQL Server 2000 - im Wesentlichen passiert, wenn eine Zeile von Prozess A gelöscht wird, während Prozess B einen Scan durchführt (entweder bei READ UNCOMMITTEDoder WITH (NOLOCK)), dann geht Prozess B "huh, was mit diesen Daten passiert ist "wenn es versucht, es zu lesen. Genauer gesagt muss die Zeile gelöscht werden, nachdem Prozess B den Index gelesen hat, aber bevor er versucht, die Datenzeile zu lesen.

Craig Freedman gibt hier einen guten Bericht

Glücklicherweise ist das Update relativ einfach: http://support.microsoft.com/kb/815008

Wenn dies nicht funktioniert, haben Sie die etwas schmerzhaftere Möglichkeit, alle Ihre WITH (NOLOCK)Hinweise zu entfernen und die Transaktionsisolationsstufe auf einen höheren Wert zu setzen READ UNCOMMITTED.

Simon Righarts
quelle
Wir sind mit diesem Fix auf dem neuesten Stand - wir haben das Flag angewendet, neu gestartet und erhalten immer noch diese Fehler.
Ciaran Archer