Eu tenho uma enorme tabela postgres (10 GB de dados - 160 milhões de registros). A tabela é estática e não há operações de gravação nela executadas. Eu quero duplicá-lo, executar gravações, reindexá-lo e, em seguida, 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?
Geralmente, a maneira mais rápida de duplicar uma tabela é simplesmente:
Os 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 que você terminar de modificar
table2
, ele poderá usar o novo nome com:O
DROP TABLE
comando precisa de um bloqueio exclusivo, que afeta os leitores simultâneos de uma maneira que você pode querer antecipar:DROP
aguardará que qualquer leitura pendente na mesa de outras transações termine.table1
não existe mais. O erro ficaria como "não foi possível abrir relação com OID oid "Para evitar o segundo problema, você pode renomear
table1
paraold_table1
em vez de eliminá-lo e, em seguida, eliminá-lo somente mais tarde fora da transação, quando esses leitores terminarem com ele. Assim, a sequência acima ficaria:Você poderia usar este desduplicador de código aberto - usa JDBC: https://github.com/bmiller1009/deduper