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 TABLE
Befehl 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
table1
nicht 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;