Pour ajouter une Colonne not NULL à une table avec de nombreux dossiers, une contrainte par DÉFAUT doit être appliquée. Cette contrainte entraîne l'ensemble de la commande ALTER TABLE pour prendre du temps à s'exécuter si la table est très importante. C'est parce que:
Hypothèses:
- La contrainte par DÉFAUT modifie les enregistrements existants. Cela signifie que la db a besoin d'augmenter la taille de chaque enregistrement, ce qui cause le changement d'enregistrements de données complètes-pages à d'autres données-pages et qui prend du temps.
- Le DÉFAUT de mise à jour s'exécute comme une transaction atomique. Cela signifie que le journal des transactions devront être développé ainsi qu'un roll-back ne peut être exécuté si nécessaire.
- Le journal des transactions garde la trace de l'ensemble de l'enregistrement. Par conséquent, même si un seul champ est modifié, l'espace requis par le journal sera basée sur la taille de l'ensemble de l'enregistrement, multiplié par le nombre de dossiers existants. Cela signifie que l'ajout d'une colonne à une table avec des petits dossiers sera plus rapide que d'ajouter une colonne à une table avec les grands dossiers, même si le nombre total de dossiers sont les mêmes pour les deux tables.
Solutions possibles:
- Sucer et attendre la fin du processus. Assurez-vous de définir le délai d'attente est très longue. Le problème, c'est que cela peut prendre des heures ou des jours à faire en fonction du nombre de dossiers.
- Ajouter la colonne, mais autoriser les valeurs NULL. Par la suite, exécuter une requête mise à JOUR pour définir la valeur par DÉFAUT pour les lignes existantes. Ne pas faire de mise à JOUR *. Mise à jour des lots de documents à un moment ou vous vous retrouverez avec le même problème que la solution n ° 1. Le problème avec cette approche est que vous vous retrouvez avec une colonne qui permet NULL lorsque l'on sait que c'est inutile option. Je crois qu'il y a quelques documents sur les pratiques exemplaires qui dit que vous ne devriez pas avoir des colonnes qui permettent NULL sauf si c'est nécessaire.
- Créer une nouvelle table avec le même schéma. Ajouter la colonne à ce schéma. Transférer les données de la table d'origine. Chute de la table d'origine et renommez la nouvelle table. Je ne suis pas certain que c'est mieux que le #1.
Questions:
- Sont mes hypothèses correctes?
- Sont mes solutions? Si oui, lequel est le meilleur? I f pas de ce que je pourrais faire d'autre?