Geralmente, a maneira mais rápida de duplicar uma tabela é simplesmente:
CREATE TABLE table2 AS SELECT * FROM table1;
INSERTs paralelos podem ser mais rápidos, mas apenas com um subsistema de disco muito rápido (quando os dados são intercalados em muitas unidades). Caso contrário, isso será mais lento.
Depois de concluir a modificação table2
, ele poderá receber o novo nome com:
BEGIN;
DROP TABLE table1;
ALTER TABLE table2 RENAME TO table1;
COMMIT;
O DROP TABLE
comando precisa de um bloqueio exclusivo, que afeta os leitores simultâneos de uma maneira que você pode antecipar:
DROP
aguardará a conclusão de qualquer leitura pendente na tabela de outras transações.
- Enquanto isso, qualquer nova transação que tente ler essa tabela será colocada em espera e falhará, pois o original
table1
não existe mais. O erro seria "não foi possível abrir relação com o OID oid "
Para evitar o segundo problema, você pode renomear table1
para, em old_table1
vez de soltá-lo, e depois soltá-lo apenas mais tarde fora da transação, quando esses leitores terminarem. Portanto, a sequência acima se tornaria:
BEGIN;
ALTER TABLE table1 RENAME TO old_table1;
ALTER TABLE table2 RENAME TO table1;
COMMIT;
...
DROP TABLE old_table1;