Descripción del problema:
Estamos lanzando una gran SELECT y las importaciones del conjunto de resultados en otra tabla. Hemos encontrado que podemos hacernos una línea de duplicados en la tabla de destino. Sin embargo esto no debería ocurrir, ya que cada línea es única.

Causa:
Tomamos nota, al mismo tiempo, otra solicitud actualiza la clave del índice agrupado. Actualizar la clave del índice agrupado justa causa el desplazamiento de las líneas en el índice.

Nos encontramos con una situación donde la ubicación física de la línea dentro de la tabla cambia debido a la operación de cambio. El resultado es que la misma línea puede ser revisada varias veces. Leer los datos utilizando un índice cuya clave se actualiza es un ejemplo del efecto de Halloween.


Recomendación:
En la mayoría de los casos, lo mejor es la posición con un índice agrupado en todas las tablas.

Un buen candidato para la clave del índice agrupado es tener las siguientes características:
   - Reduzca el tamaño (ya que repite en todos los no-cluster)
   - Único
   - Incremental
   - Estática

Al igual que en un índice agrupado, las filas de los datos se almacenan en orden basado en la clave del índice agrupado, el problema aparece porque una actualización de la clave se produce. Una clave de índice no se actualizan con frecuencia.

Resolución:
Para asegurarse de que no hay ninguna línea que no se actualiza durante la selección, y leer de nuevo la misma línea, hemos solucionado el problema con la sugerencia de tabla HOLDLOCK y guía de plan.


Conexiones:
- The "Halloween Problem" for XML APIs
- Halloween Protection

Feliz Halloween! ;-)

Michel Degremont | Premier Field Engineer - SQL Server Core Engineer |