Por que o pg_restore demora tanto no Ubuntu quanto no Windows?

4

Eu gerou um arquivo de despejo de 21 MB ou mais:

pg_dump --format=tar --verbose --file=database.backup mydatabase

Quando eu importo este arquivo no windows fazendo:

pg_restore --dbname mydatabase --verbose database.backup

Demora 1 hora para ser feito.

Fazendo o mesmo nas caixas Ubuntu 10.10 64bits, leva cerca de 7 horas!

Claro que estou falando das mesmas especificações de hardware (Dell Studio XPS). Mesma RAM, CPU, etc.

Em ambos os casos, estou usando configurações de caixa para o PostgreSQL 8.4.7.

Talvez a configuração das distros seja diferente ... Talvez alguma otimização que apenas o Windows distro esteja fazendo?

Informação extra: No Windows 7 - > NTFS. No Ubuntu 10.10 - > ext4

Quando faço

pg_dump --format=tar --verbose --file=workspace/work/dumps/loaded.backup mydb

Eu levo apenas 5 segundos! Se eu restaurar em um novo db vazio fazendo:

pg_restore --dbname mydb-2 --verbose workspace/work/dumps/loaded.backup

Eu levo apenas 10 segundos. (Problema resolvido? ... quase) Parece que o db exportou o dump original usando diferentes opções. Talvez opção --inserts?

A grande diferença entre o Windows e o Ubuntu usando o despejo original ainda está incomodando minha mente. Alguma idéia sobre isso?

    
por berserkpi 13.04.2011 / 19:19

3 respostas

3

Até uma hora é muito longa para um pequeno arquivo de despejo de 21 MB. Estamos restaurando bancos de dados de arquivos de despejo comprimido de 2 GB em cerca de 30 minutos, mas podemos ter um hardware melhor; -)

O que você deve ler primeiro:

http://www.postgresql.org/docs/8.4/static/populate.html

É tudo sobre o seu problema. Ele informa como criar um banco de dados rapidamente.

Sugestões

Adicionais :

  • Primeiro, ative o registro de todas as declarações com o tempo de duração e veja o que está acontecendo
  • Aumentar shared_buffers, padrão no Ubuntu 10.10 é de apenas 24 MB, veja link para configurar seu sistema linux para aceitar valores mais altos
  • use --format = custom ou -Fc para dumping. É a melhor escolha
  • você pode executar pg_restore em múltiplas CPUs com "-j" mas eu acho que você tem outros problemas que obter os últimos bits de performance

Para mais informações:

por 14.04.2011 / 11:03
2

Edit: Eu senti falta que você disse que o lixo é meramente 21MB, e nem mesmo compactado. Até 1 hora é um tempo muito para restaurar essa quantidade de dados. Você poderia lançar alguma luz sobre o que o despejo contém? Que tipo de estrutura de tabela, quantos índices e de que tipo? Índices funcionais? Índices GiST / GIN? Quantos dados são gerados depois que o dump é restaurado?

A lista de discussão do PostgreSQL pode ser um lugar melhor para discutir isso.

Post antigo

A configuração padrão do PostgreSQL é muito conservadora em termos de requisitos de recursos. O que significa que durante o carregamento em massa, ele precisa executar pontos de verificação muito frequentes (seus logs do Postgres provavelmente estão cheios de avisos de ponto de verificação).

Eu suspeito que o PostgreSQL no Windows pode não liberar tudo corretamente no disco, portanto, os pontos de verificação não afetam muito o desempenho. Se for verdade, isso é obviamente ruim para a integridade do banco de dados.

Se minhas suposições forem verdadeiras, bater checkpoint_segments até 50 na configuração do Ubuntu deve fazê-lo funcionar de forma semelhante ao Windows. (Existem muitos outros sintonizadores, mas este é o mais importante para o carregamento em massa)

Além disso, o que o SHOW wal_sync_method diz sobre a sua instalação do Ubuntu? Deve ser fdatasync para desempenho ideal, mas algumas versões são padronizadas como open_datasync .

    
por 14.04.2011 / 00:22
-1

Tente desativar o autovacuum no seu postgresql.conf.

Se isso não ajudar, tente desfragmentar seu disco ...

Além disso, gostaria de saber qual foi o sistema de arquivos em ambos os casos?

    
por 13.04.2011 / 19:35