Je n'ai pas de "meilleure" réponse, mais j'ai une "moins mauvaise" réponse qui pourrait vous permettre de faire les choses assez rapidement.
Ma table avait des lignes de 2MM et les performances de la mise à jour étaient médiocres lorsque j'ai tenté d'ajouter une colonne d'horodatage secondaire à la première.
ALTER TABLE mytable ADD new_timestamp TIMESTAMP ;
UPDATE mytable SET new_timestamp = old_timestamp ;
ALTER TABLE mytable ALTER new_timestamp SET NOT NULL ;
Après 40 minutes d’attente, j’ai essayé ceci sur un petit lot pour avoir une idée du temps que cela pouvait prendre - la prévision était d’environ 8 heures.
La réponse acceptée est définitivement meilleure - mais cette table est fortement utilisée dans ma base de données. Il y a quelques dizaines de tables avec FKEY dessus; Je voulais éviter de changer de touches étrangères sur autant de tables. Et puis il y a des points de vue.
Un peu de recherche de documents, d'études de cas et de StackOverflow, et j'ai eu le "A-Ha!" moment. Le drain ne se trouvait pas sur la mise à jour principale, mais sur toutes les opérations INDEX. Ma table comportait 12 index, quelques-uns pour les contraintes uniques, quelques-uns pour accélérer le planificateur de requêtes et quelques-uns pour la recherche en texte intégral.
Chaque ligne mise à jour ne fonctionnait pas uniquement sur un élément DELETE / INSERT, mais aussi sur la surcharge liée à la modification de chaque index et à la vérification des contraintes.
Ma solution consistait à supprimer tous les index et contraintes, à mettre à jour la table, puis à rajouter tous les index / contraintes.
Il a fallu environ 3 minutes pour écrire une transaction SQL ayant les conséquences suivantes:
- COMMENCER;
- abandonné les index / constaints
- table de mise à jour
- rajouter des index / contraintes
- COMMETTRE;
Le script a pris 7 minutes pour s'exécuter.
La réponse acceptée est définitivement meilleure et plus appropriée ... et élimine pratiquement le besoin de temps d'arrêt. Dans mon cas, toutefois, il aurait fallu beaucoup plus de "développeurs" pour utiliser cette solution et nous avions une fenêtre d'indisponibilité planifiée de 30 minutes pour y parvenir. Notre solution en tenait compte dans 10.
ALTER TABLE .. ADD COLUMN ...
ou faut-il y répondre également?