En ajoutant NOT NULL
colonnes avec une valeur DEFAULT
- Est-ce que PostgreSQL optimise cette opération?
Si la table dispose de N lignes, une colonne ALTER-TABLE-ADD-TABLE non optimisée donnerait n écrit de la valeur par défaut - ce qui pourrait être très douloureux, évidemment. Avec l'optimisation, la DB créerait instantanément la nouvelle colonne, stockez une seule copie de la valeur par défaut qui serait renvoyée lorsqu'aucune valeur non par défaut n'est trouvée pour cette colonne dans une structure de données d'index appropriée.
Par exemple oracle 11g a une optimisation .
Il n'y a pas de tel mécanisme dans PostgreSQL.
Cependant, vous pouvez toujours éviter les effets excessives d'un tel changement de table.
L'instruction suivante acquiert un Accéder à une serrure exclusive sur la table pendant la durée de la déclaration/transaction:
ALTER TABLE your_table
ADD COLUMN new_column integer NOT NULL DEFAULT 0;
Cette instruction modifie le catalogue, puis réécrit la table entière de sorte que la nouvelle colonne contienne la valeur par défaut dans toutes les lignes. Si la table présente de nombreuses lignes et que vous avez accès souvent suffisamment, cela entraînerait des problèmes temporaires.
Pour l'éviter, essayez de tenir la serrure exclusive aussi courte que possible:
ALTER TABLE your_table
ADD COLUMN new_column integer;
ALTER TABLE your_table
ALTER COLUMN new_column SET DEFAULT 0;
Comme il s'agit fondamentalement, un changement (en réellement deux) au catalogue (aucun changement de données ne se produit), il sera assez rapide. Ensuite, en fonction de vos besoins et de vos besoins de table, vous pouvez mettre à jour la nouvelle colonne à la valeur par défaut dans une étape ou par lots, et lorsque vous avez terminé, définissez la colonne sur NOT NULL
.
Mise à jour sur un souhait First: PostgreSQL 11 aura cette fonctionnalité. Voir https://www.depesz.com/2018/04/04/waitting-for-postgresql-11-fast-alter-table-add-column-with-a-non-null-default/ Pour plus.
Cette fonctionnalité est nouvelle et atterri dans la version 11.
ALTER TABLE your_table
ADD COLUMN new_column integer NOT NULL DEFAULT 0;
Ce qui précède est une telle commande qui sera affectée par cette optimisation; Mais cela devrait être dit le NOT NULL
est non requis. Toute nouvelle colonne ajoutée avec une valeur par défaut non nulle est optimisée maintenant. Vous pouvez trouver l'entrée dans ce comtefest Vous devez également vérifier cela Great Write-up à ce sujet, "Un lien manquant dans Postgres 11: Création de colonne rapide avec défaut" .
Si vous essayez d'éviter la table exclusive de la table sur la table, suivez les conseils de Craig Singer,
DEFAULT
ALTER
it to ajouter le DEFAULT
ensuite, il s'applique donc aux lignes nouvellement inséréesUPDATE
sNOT NULL
contrainte