De vez en cuando aparece "No se pudo continuar con el escaneo NOLOCK
debido al movimiento de datos" con algunos trabajos grandes, que tienen WITH (NOLOCK)
en las consultas de selección.
Entiendo que esto tiene algo que ver con el intento de seleccionar datos cuando ha habido una división de página que causó que los datos ya no estuvieran donde se suponía que debían estar; supongo que eso es lo que está sucediendo en mi entorno.
¿Cómo reproduciría esto?
Estoy tratando de hacer una solución a corto plazo para detectar el error y volver a intentarlo cuando esto sucede, pero no puedo probarlo si no puedo reproducirlo. ¿Hay una manera razonablemente confiable de causar esto?
Cuando sucede, la ejecución de la consulta nuevamente resulta exitosa, por lo que realmente no tengo ninguna preocupación sobre si los datos reales o la base de datos están permanentemente corruptos. Algunas de las tablas de la consulta (junto con sus índices) se descartan, se recrean y se vuelven a llenar a menudo, por lo que supongo que es algo relacionado con eso.
Eliminar NOLOCK
es mi problema a largo plazo con el que lidiar. En NOLOCK
primer lugar, la razón fue que las consultas eran tan malas que estaban bloqueadas con las transacciones diarias, por lo que NOLOCK
era una curita para detener los puntos muertos (que funcionó). Así que necesito una curita en una curita hasta que podamos hacer una solución permanente.
Si pudiera reproducirlo con Hello World, probablemente planearía poner la curita en el trabajo en menos de una hora. No puedo hacer una eliminación de búsqueda y reemplazo NOLOCK
, porque comenzaría a obtener los puntos muertos de la aplicación nuevamente, lo que es peor para mí que un trabajo de falla ocasional.
El uso del aislamiento de instantáneas comprometido con la lectura es una buena posibilidad: tendré que trabajar con nuestro equipo de base de datos para obtener más detalles al respecto. Parte de nuestro problema es que no tenemos un experto en SQL Server para hacer frente a ese tipo de cosas, y no entiendo los niveles de aislamiento lo suficientemente bien como para hacer ese cambio en este momento.
DEADLOCK_PRIORITY
que LOW
en los puestos de trabajo, por lo que si hay puntos muertos, los puestos de trabajo se producirá un error, y no las aplicaciones. Después de eso, podría investigar los puntos muertos y descubrir por qué están sucediendo, y solucionar ese problema. Podría ser una solución muy simple, como intercambiar el orden de dos declaraciones. Cualquiera que sea el problema, noNOLOCK
es la solución , así que deja de intentar forzarlo a ser solo porque eso es más fácil.
NOLOCK
de estos trabajos? 601 debería ser la menor de sus preocupaciones si se supone que los resultados de estas consultas son precisos . Paul White muestra un ejemplo particularmente terrible de lectura de datos que no debería ser posible aquí .