Usando PG 9.1 no Ubuntu 12.04.
Atualmente, leva até 24h para executarmos um grande conjunto de instruções UPDATE em um banco de dados, que são da forma:
UPDATE table
SET field1 = constant1, field2 = constant2, ...
WHERE id = constid
(Estamos apenas sobrescrevendo campos de objetos identificados por ID.) Os valores vêm de uma fonte de dados externa (ainda não no banco de dados em uma tabela).
As tabelas têm um punhado de índices cada e nenhuma restrição de chave estrangeira. Nenhum COMMIT é feito até o final.
Demora 2h para importar um pg_dump
banco de dados inteiro. Esta parece ser uma linha de base que devemos razoavelmente visar.
Além de produzir um programa personalizado que de alguma forma reconstrói um conjunto de dados para o PostgreSQL reimportar, há algo que possamos fazer para aproximar o desempenho do UPDATE em massa ao da importação? (Esta é uma área que acreditamos que as árvores de mesclagem estruturadas em log lidam bem, mas estamos nos perguntando se há algo que possamos fazer no PostgreSQL.)
Algumas ideias:
- descartando todos os índices não-ID e reconstruindo depois?
- aumentando checkpoint_segments, mas isso realmente ajuda a sustentar a taxa de transferência de longo prazo?
- usando as técnicas mencionadas aqui ? (Carregar novos dados como tabela e, em seguida, "mesclar" dados antigos onde o ID não é encontrado em novos dados)
Basicamente, há um monte de coisas para tentar e não temos certeza de quais são as mais eficazes ou se estamos negligenciando 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.