Как правило, самый быстрый способ дублировать таблицу - это просто:
CREATE TABLE table2 AS SELECT * FROM table1;
Параллельные INSERT могут быть быстрее, но только с очень быстрой дисковой подсистемой (когда данные чередуются на многих дисках). В противном случае это будет медленнее.
Как только вы закончите с изменением table2
, оно может принять новое имя с:
BEGIN;
DROP TABLE table1;
ALTER TABLE table2 RENAME TO table1;
COMMIT;
DROP TABLE
Команда должна монопольная блокировка, которая влияет одновременно читатель таким образом , вы можете захотеть , чтобы предвидеть:
DROP
будет ожидать завершения любого ожидающего чтения таблицы из других транзакций.
- Любая новая транзакция, пытающаяся прочитать эту таблицу за это время, будет переведена в режим ожидания, а затем потерпит неудачу, поскольку оригинал
table1
больше не существует. Ошибка будет выглядеть как «не удалось открыть связь с OID OID »
Чтобы избежать второй проблемы, вы можете переименовать table1
ее old_table1
вместо удаления, а затем удалить ее только позднее вне транзакции, когда эти читатели покончат с этим. Таким образом, приведенная выше последовательность станет:
BEGIN;
ALTER TABLE table1 RENAME TO old_table1;
ALTER TABLE table2 RENAME TO table1;
COMMIT;
...
DROP TABLE old_table1;