Dependendo de quantos conjuntos de dados diferentes existem, uma opção seria particionar as tabelas por conjunto de dados.
Quando um conjunto de dados é atualizado, BEGIN
uma nova transação, TRUNCATE
a tabela, COPY
os novos dados nele e COMMIT
. O PostgreSQL possui uma otimização na qual COPY
uma tabela que foi TRUNCATE
d na mesma transação faz muito menos E / S se você estiver usando wal_level = minimal
(o padrão).
Se você não puder particionar e truncar (por exemplo, se estiver lidando com dezenas ou centenas de milhares de conjuntos de dados, onde haveria muitas tabelas), será melhor acionar o autovacuum para executar o máximo possível , verifique se você possui bons índices em tudo o que excluir com base e esteja preparado para um desempenho um tanto comum.
Se você não precisa de segurança contra falhas - você não se importa que suas tabelas estejam vazias após uma falha no sistema - você também pode criar suas tabelas como UNLOGGED
, o que economizará uma enorme quantidade de custo de E / S.
Se você não se importa em restaurar toda a configuração de um backup após uma falha no sistema, pode ir além e também definir fsync=off
, o que basicamente diz ao PostgreSQL "não se preocupe com a segurança de falhas, eu tenho bons backups e não não me importo se meus dados são permanentemente e totalmente irrecuperáveis após uma falha e estou feliz em voltar initdb
antes de poder usar meu banco de dados novamente ".
Escrevi um pouco mais sobre isso em um tópico semelhante no Stack Overflow sobre a otimização do PostgreSQL para testes rápidos ; que menciona o ajuste do SO do host, separando o WAL em um disco diferente, se você não estiver usando unlogged
tabelas, ajustes no indicador de verificação, etc.
Há também algumas informações nos documentos da página para carregamento rápido de dados e configurações não duráveis .
SIGKILL
editado, etc.), qualquerUNLOGGED
tabela pode serTRUNCATE
d, então ela está vazia na inicialização. Eles não são truncados após um desligamento e uma reinicialização limpos, mas você não deve confiar neles como duráveis.UNLOGGED
opção por mesa é simplesmente ótimo.TRUNCATE
ouDROP/CREATE TABLE
sequência?TRUNCATE
, pessoalmente. A rotatividade de DDL tem seus próprios custos. Como você faz alterações com tanta frequência, será muito importante garantir que você ative a agressividade do autovacuumpg_catalog.pg_class
e outras tabelas do sistema que possam inchar com essa carga de trabalho.