Description du problème :
Nous lançons un énorme  SELECT et nous importons le jeu de résultats dans une autre table. Nous avons découvert que nous obtenions quelques ligne en doublons dans la table de destination. Cependant ça ne devrait pas se produire car chaque ligne est unique.

Cause:
Nous remarquons qu'au même moment, une autre requête met à jour la clé de l'index cluster. Mettre à jour la clé de l'index cluster peu provoquer un  déplacement  des lignes dans l'index.

Nous rencontrons une situation  la localisation physique de la ligne à l'intérieur de la table  change à cause de l'opération de modification. Le résultat est que la même ligne  peut être revisitée plusieurs fois. Lire des données en utilisant un index dont la clé va être mise à jours est un exemple d'effet Halloween.


Recommandation:
Dans la plupart des cas, il est préférable de positionner avec un index cluster sur toutes vos tables.

Un bon candidat pour la clé d'index cluster serait d'avoir les caractéristiques suivantes:
  - Etroit en taille (puisque répété dans tous les non-cluster)
  - Unique
  - Incrémental
  - Statique

Comme dans un index ordonné en clusters, les lignes de données sont stockés dans l'ordre basé sur la clé de l'index  cluster, le problème apparait car une mise à jour  de la clé se produit. Une clé d'index ne devrait pas être mise à jour fréquemment


Résolution:

Pour garantir qu'aucune ligne n'est pas mis à jour pendant le select, et de relire de nouveau la même ligne, nous avons fixé le problème  avec le hint de table HOLDLOCK et un plan guide.


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

Joyeux Halloween! ;-)

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