Wie dupliziere ich eine riesige Postgres-Tabelle?

29

Ich habe eine riesige Postgres-Tabelle (10 GB Daten - 160 MB Datensätze). Die Tabelle ist statisch und es werden keine Schreibvorgänge ausgeführt. Ich möchte es duplizieren, Schreibvorgänge ausführen, es neu indizieren und dann mit einer einzigen schnellen Transaktion die alte löschen und die neue in den ursprünglichen Namen umbenennen.

Was ist der schnellste Weg, um solch eine riesige Tabelle zu duplizieren?

Milovan Zogovic
quelle

Antworten:

55

Im Allgemeinen ist der schnellste Weg, eine Tabelle zu duplizieren, einfach:

CREATE TABLE table2 AS SELECT * FROM table1;

Parallele INSERTs sind möglicherweise schneller, jedoch nur mit einem sehr schnellen Festplattensubsystem (wenn Daten auf vielen Laufwerken verschachtelt sind). Andernfalls wird dies langsamer.

Sobald Sie mit dem Ändern fertig sind table2, können Sie den neuen Namen übernehmen mit:

BEGIN;
DROP TABLE table1;
ALTER TABLE table2 RENAME TO table1;
COMMIT;

Der DROP TABLEBefehl benötigt eine exklusive Sperre, die sich auf gleichzeitige Leser auswirkt, wie Sie es vielleicht vorwegnehmen möchten:

  • DROP Wartet, bis in der Tabelle ausstehende Lesevorgänge anderer Transaktionen abgeschlossen sind.
  • Jede neue Transaktion, die in der Zwischenzeit versucht, diese Tabelle zu lesen, wird in den Wartezustand versetzt und schlägt fehl, da das Original table1nicht mehr vorhanden ist. Der Fehler würde so aussehen: "Konnte keine Beziehung zu OID oid herstellen. "

Um das zweite Problem zu vermeiden, können Sie es in umbenennen table1 , old_table1 anstatt es zu löschen, und es erst später außerhalb der Transaktion löschen, wenn diese Leser damit fertig sind. Die obige Reihenfolge würde also lauten:

BEGIN;
ALTER TABLE table1 RENAME TO old_table1;
ALTER TABLE table2 RENAME TO table1;
COMMIT;
...
DROP TABLE old_table1;
Daniel Vérité
quelle
2
Danke, Mann. Dies ist genau die Art von Erklärung, nach der ich gesucht habe. Danke noch einmal!
Milovan Zogovic
Wenn für Tabelle2 Indizes definiert sind, funktionieren diese auch nach dem Umbenennen der Tabelle?
BamaPookie
1
@BamaPookie Sieh dir das vollständige Schema mit Indizes, Einschränkungen und Standardwerten an. Wiki.postgresql.org/wiki/Clone_schema
Timothy Vogel