web-dev-qa-db-fra.com

Est-ce que PostgreSQL optimise l'ajout de colonnes avec des valeurs par défaut non nulelles?

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 .

9
maxschlepzig

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.

15
dezso

Oui, avec PostgreSQL 11

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" .

Pre-PostgreSQL 11 Solution de contournement

Si vous essayez d'éviter la table exclusive de la table sur la table, suivez les conseils de Craig Singer,

  • Ajouter une colonne sans DEFAULT
  • ALTER it to ajouter le DEFAULT ensuite, il s'applique donc aux lignes nouvellement insérées
  • Puis remplissez la nouvelle colonne sur les lignes existantes par lot progressif UPDATEs
  • Lorsque toutes les lignes ont la valeur, vous ajoutez le NOT NULL contrainte
3
Evan Carroll