Как скопировать огромную таблицу postgres?


29

У меня есть огромная таблица postgres (10 ГБ данных - 160 миллионов записей). Таблица является статической, и над ней не выполняется никаких операций записи. Я хочу скопировать его, выполнить запись, переиндексировать, а затем с помощью одной быстрой транзакции удалить старую и переименовать новую в оригинальное имя.

Какой самый быстрый способ дублировать такую ​​огромную таблицу?

Ответы:


55

Как правило, самый быстрый способ дублировать таблицу - это просто:

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;

2
Спасибо чувак. Это именно то объяснение, которое я искал. Еще раз спасибо!
Милован Зогович

Если в таблице 2 определены индексы, будут ли они работать после переименования таблицы?
BamaPookie

1
@BamaPookie проверить это для полной схемы, включая индексы, ограничения и значения по умолчанию wiki.postgresql.org/wiki/Clone_schema
Тимоти Фогель
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.