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 NOLOCK
pistas 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
fuente
Respuestas:
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 UNCOMMITTED
oWITH (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 superiorREAD UNCOMMITTED
.fuente