Usando o PG 9.1 no Ubuntu 12.04.
Atualmente, leva até 24 horas para executarmos um grande conjunto de instruções UPDATE em um banco de dados, que estão no formato:
UPDATE table
SET field1 = constant1, field2 = constant2, ...
WHERE id = constid
(Estamos apenas substituindo os campos dos objetos identificados pelo ID.) Os valores vêm de uma fonte de dados externa (ainda não no banco de dados de uma tabela).
As tabelas possuem vários índices e nenhuma restrição de chave estrangeira. Nenhum COMMIT é feito até o fim.
Leva 2h para importar um pg_dump
banco de dados inteiro. Parece uma linha de base que devemos razoavelmente atingir.
Com exceção da produção de um programa personalizado que, de alguma forma, reconstrói um conjunto de dados para a importação do PostgreSQL, existe alguma coisa que podemos fazer para trazer o desempenho UPDATE em massa mais próximo do da importação? (Essa é uma área que acreditamos que as árvores de mesclagem estruturadas em log lidam bem, mas estamos pensando se há algo que possamos fazer no PostgreSQL.)
Algumas ideias:
- descartando todos os índices que não são de ID e reconstruindo depois?
- aumentar os pontos de verificação, mas isso realmente ajuda a taxa de transferência sustentada a longo prazo?
- usando as técnicas mencionadas aqui ? (Carregue novos dados como tabela e "mescle" dados antigos em que o ID não foi encontrado nos novos dados)
Basicamente, existem várias coisas para tentar e não temos certeza do que são mais eficazes ou se estamos ignorando outras coisas. Passaremos os próximos dias experimentando, mas pensamos em perguntar aqui também.
Eu tenho carga simultânea na tabela, mas é somente leitura.
explain analyze
que está usando um índice para a pesquisa?