Como duplicar uma enorme tabela do postgres?


29

Eu tenho uma enorme tabela de postgres (10 GB de dados - registros de 160 milhões). A tabela é estática e não há operações de gravação executadas. Quero duplicá-lo, executar gravações, reindexá-lo e, com uma única transação rápida, excluir o antigo e renomear o novo para o nome original.

Qual é a maneira mais rápida de duplicar uma tabela tão grande?

Respostas:


55

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 TABLEcomando 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 table1nã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;

2
Obrigado cara. Este é exatamente o tipo de explicação que eu estava procurando. Obrigado novamente!
Milovan Zogovic

Se houver índices definidos na tabela2, eles ainda funcionarão depois que a tabela for renomeada?
BamaPookie

1
@BamaPookie confira este para o esquema completo, incluindo índices, restrições e padrões wiki.postgresql.org/wiki/Clone_schema
Timothy Vogel
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.