Optimiert PostgreSQL das Hinzufügen von Spalten mit Nicht-NULL-STANDARD?

9

Optimiert PostgreSQL beim Hinzufügen von NOT NULLSpalten mit einem DEFAULTWert diesen Vorgang?

Falls die Tabelle n Zeilen enthält, würde eine nicht optimierte alter-table-add-column n Schreibvorgänge des Standardwerts ergeben - was natürlich sehr schmerzhaft sein kann. Bei der Optimierung würde die Datenbank sofort die neue Spalte erstellen und nur eine Kopie des Standardwerts speichern, der zurückgegeben wird, wenn für diese Spalte kein nicht standardmäßiger Wert in einer geeigneten Indexdatenstruktur gefunden wird.

Zum Beispiel hat Oracle 11g eine solche Optimierung .

maxschlepzig
quelle

Antworten:

15

In PostgreSQL gibt es keinen solchen Mechanismus.

Sie können jedoch die übermäßigen Auswirkungen einer solchen Tabellenänderung vermeiden.

Die folgende Anweisung erhält für die Dauer der Anweisung / Transaktion eine exklusive Zugriffssperre für die Tabelle:

ALTER TABLE your_table
    ADD COLUMN new_column integer NOT NULL DEFAULT 0;

Diese Anweisung ändert den Katalog und schreibt dann die gesamte Tabelle neu, sodass die neue Spalte den Standardwert in allen Zeilen enthält. Wenn die Tabelle viele Zeilen enthält und häufig genug zugegriffen wird, würde dies einige vorübergehende Probleme verursachen.

Um dies zu vermeiden, versuchen Sie, das exklusive Schloss so kurz wie möglich zu halten:

ALTER TABLE your_table
    ADD COLUMN new_column integer;
ALTER TABLE your_table
    ALTER COLUMN new_column SET DEFAULT 0;

Da dies im Grunde nur eine (tatsächlich zwei) Änderung des Katalogs ist (keine Datenänderung erfolgt), wird er ziemlich schnell abgeschlossen. Abhängig von Ihren Anforderungen und der Verwendung der Tabelle können Sie die neue Spalte in einem Schritt oder in Stapeln auf die Standardeinstellung aktualisieren und anschließend die Spalte auf setzen NOT NULL.

Update über einen wahr gewordenen Wunsch: PostgreSQL 11 wird diese Funktion haben. Weitere Informationen finden Sie unter https://www.depesz.com/2018/04/04/waiting-for-postgresql-11-fast-alter-table-add-column-with-a-non-null-default/ .

dezso
quelle
3

Ja, mit PostgreSQL 11

Diese Funktion ist neu und in Version 11 gelandet.

ALTER TABLE your_table
    ADD COLUMN new_column integer NOT NULL DEFAULT 0;

Das Obige ist ein solcher Befehl, der von dieser Optimierung betroffen ist. aber sollte man sagen, das NOT NULList nicht erforderlich. Jede neue Spalte, die mit einem Standardwert ungleich Null hinzugefügt wurde, ist jetzt optimiert. Sie finden den Eintrag in diesem Commitfest. Sie sollten auch diesen großartigen Artikel darüber lesen : "Ein fehlender Link in Postgres 11: Schnelle Spaltenerstellung mit Standardeinstellungen" .

Pre-PostgreSQL 11-Problemumgehung

Wenn Sie versuchen, die exklusive Tischsperre auf dem Tisch zu vermeiden, befolgen Sie die Ratschläge von Craig Ringer,

  • Fügen Sie eine Spalte ohne ein DEFAULT
  • ALTERes, um das DEFAULTdanach hinzuzufügen, so gilt es für neu eingefügte Zeilen
  • Dann bevölkert die neue Spalte auf vorhandene Zeilen durch progressives Batch UPDATEs
  • Wenn alle Zeilen den Wert haben, fügen Sie die NOT NULLEinschränkung hinzu
Evan Carroll
quelle