No se pudo continuar el escaneo con NOLOCK debido al movimiento de datos

10

Ejecutamos SQL Server 2000 y recibimos algunos de estos errores todas las noches.

Could not continue scan with NOLOCK due to data movement

La consulta que arroja este error es una consulta grande y compleja que une más de una docena de tablas. Nuestros datos subyacentes se pueden actualizar con frecuencia.

La "mejor práctica" cultural es que, en el pasado, la introducción de NOLOCKpistas aumentó el rendimiento y mejoró la concurrencia. Esta consulta no necesita ser 100% precisa, es decir, toleraremos lecturas sucias, etc. Sin embargo, nos cuesta entender por qué la base de datos arroja este error, a pesar de que tenemos todas estas sugerencias de bloqueo.

¿Alguien puede arrojar algo de luz sobre esto? Sea amable, en realidad soy un programador, no un DBA :)

PD: hemos aplicado la corrección mencionada anteriormente anteriormente: http://support.microsoft.com/kb/815008

Arquero Ciaran
fuente
3
Soltaría el NOLOCK y arreglaría la consulta / índices / proceso. Podemos ayudar, por supuesto ... También vea en.wikipedia.org/wiki/Halloween_Problem
gbn
3
@SQLKiwi: SQL 2012 se recupera con gracia en muchos casos de movimiento de datos bajo análisis sucios (continúa en la página siguiente en orden de asignación).
Remus Rusanu
1
@SQLKiwi: sí, todavía hay. En las buenas noticias: también los cursores respaldados por escaneos sucios deberían manejar esto con más gracia.
Remus Rusanu

Respuestas:

7

Este es un problema razonablemente conocido con SQL Server 2000: en esencia, lo que sucede es que si una fila se elimina por el proceso A mientras el proceso B está escaneando (ya sea en READ UNCOMMITTEDo WITH (NOLOCK)), el proceso B dice "¿Qué pasó con estos datos? "cuando intenta leerlo. Más precisamente, la fila tiene que eliminarse después de que el proceso B lee el índice, pero antes de que intente leer la fila de datos.

Craig Freedman da una buena reseña aquí

Afortunadamente, la solución es relativamente simple: http://support.microsoft.com/kb/815008

Si eso no funciona, tiene la opción un poco más dolorosa de eliminar todas sus WITH (NOLOCK)sugerencias y establecer su nivel de aislamiento de transacción en algo superior READ UNCOMMITTED.

Simon Righarts
fuente
Estamos al día con esa solución: aplicamos la bandera, la reiniciamos y aún recibimos estos errores.
Ciaran Archer