Envisagez de créer une nouvelle table avec le même schéma plus la colonne rowversion et ajoutez une vue au-dessus des deux tables qui fait une union. Demandez aux utilisateurs d'utiliser la vue et d'écrire à la place des déclencheurs sur les tables et vues sous-jacentes.
Les insertions doivent être envoyées à la nouvelle table, les mises à jour doivent déplacer les données vers la nouvelle table et les suppressions doivent être appliquées aux deux tables.
Effectuez ensuite des déplacements par lots en arrière-plan, en déplaçant autant d'enregistrements à la fois que vous le pouvez vers la nouvelle table. Vous pouvez toujours avoir des problèmes de simultanéité pendant que cela se passe et certains plans d'exécution craptaculaires, mais cela vous permet de rester en ligne pendant que les mouvements se produisent.
Idéalement, vous démarrez le processus un vendredi après-midi pour minimiser l'effet sur les utilisateurs finaux et essayez de le faire avant le lundi matin. Une fois qu'il est en place, vous pouvez modifier la vue pour pointer uniquement vers la nouvelle table, et les plans d'exécution craptaculaires disparaissent. Idéalement.
Pour éviter le déclenchement des déclencheurs lorsque les données sont migrées par lots, examinez le nombre de lignes dans les tables supprimées / insérées dans le déclencheur et ignorez les activités si elles sont proches du nombre de lignes de votre lot.
À la fin, Michael a décidé d'ignorer la vue (et non de la supprimer du tableau d'origine) pour obtenir des plans plus stables. Le compromis tenait essentiellement deux exemplaires du tableau. Il l'a transformé en une série de billets de blog .
Si
TIMESTAMP
vous ajoutez estNULLABLE
:VARBINARY(8)
colonneUne fois remplie, dans les instructions SQL consécutives,
DROP
laVARBINARY(8)
colonne que vous venez d'ajouter et de remplir, puis ajoutez laTIMESTAMP NULL
colonne.Si
TIMESTAMP
vous ajoutez estNOT NULLABLE
:BINARY(8)
colonneUne fois remplie, dans les instructions SQL consécutives,
DROP
laBINARY(8)
colonne que vous venez d'ajouter et remplie et laADD THE TIMESTAMP NOT NULL
colonne.la source