Eu tenho duas tabelas de banco de dados. Um contém centenas de milhões de registros. Vamos chamar assim history
. O outro é calculado diariamente e quero copiar todos os seus registros para history
esse.
O que eu fiz foi correr:
INSERT INTO history SELECT * FROM daily
E fez o truque por um tempo, mas começou a ficar cada vez mais lento à medida que o número de registros continuava crescendo. Agora, tenho cerca de 2 milhões de registros que precisam ser copiados de daily
para uma history
única operação e leva muito tempo para ser concluído.
Existe outra maneira mais eficiente de copiar dados de uma tabela para outra?
fonte
Despejar a tabela no formato csv
use o comando COPY, que é muito mais eficiente para grandes quantidades de dados.
Verifique os documentos do postgres em http://www.postgresql.org/docs/current/static/sql-copy.html para obter mais informações
fonte
history
tabela e anexamos mais 3 milhões de linhas.O problema estava com os índices. A
history
tabela tinha 160 milhões de linhas indexadas. Ao executar umCOPY FROM
ouINSERT INTO .. SELECT
levava muito tempo, não para inserir linhas, mas para atualizar índices. Quando desabilitei os índices, ele importou 3 milhões de linhas em 10 segundos. Agora, preciso encontrar uma maneira mais rápida de reindexar a grande mesa.fonte
Você pode usar a ferramenta psql , posso ser eficiente, como a seguir,
Além disso, você pode escrever um script de shell.
fonte
Obviamente, essa não é uma resposta exata para sua pergunta, mas se você não precisar acessar a
history
tabela, também poderá gerar um dump SQL:Então, pode-se usar uma ferramenta como
git
calcular a diferença e armazená-la com eficiência.Isso é útil porque a maioria das partes de um banco de dados não muda todos os dias. Em vez de armazenar uma cópia inteira para todos os dias, é possível armazenar a diferença entre dois dias.
Você pode usar um
crontab
trabalho para que o despejo seja processado todos os dias.fonte