servidor estrangeiro 9.2
servidor local 9.5
mesa é 10GB
transferência de dados realizada na mesma interface de rede que o servidor externo funciona
nenhum índice definido nos dados
à moda antiga:
- copiar para - 2:36
- scp - 08:17
- copiar de - 10:11
postgres_fdw:
- quando o old way terminou, ele fez 800 MB de
insert into .. select * from foreign_table
- quando o old way terminou, ele fez 800 MB de
Perdi algo na configuração (o que significa que posso melhorá-lo) ou postgres_fdw
simplesmente não é para carregamento em massa (o que significa que não posso melhorá-lo)?
(Eu o uso para reconciliação de pequenas quantidades de dados e funciona bem. A ideia de insert select from fdw
, em vez de executar comandos bash, parecia tão legal.)*
Eu tentei o psql para o servidor remoto do servidor local e \copy table
- seis minutos - mais rápido que o ssh.
A fetch_size
opção, não disponível antes de 9.6, pode ser simulada dblink_fetch(CURSOR, fetch_size)
- veja minha resposta abaixo.
postgres_fdw certamente não é tão otimizado para transferência em massa quanto
copy to
,copy from
, escp
são. Afinal, a transferência em massa é o principal motivo da existência dessas ferramentas.Mas isso não significa que não há nada que você possa fazer. Se você estivesse executando o 9.6 no servidor local, você poderia tentar aumentar o fetch_size.
antes de 9.6 fetch_size não pode ser definido para servidor nem para tabela externa, mas podemos simular essa opção usando dblinks para operação em massa. No caso abaixo, acelerei a seleção em massa de tabela de ~1 GB de postgres_fdw de hora e meia para dois minutos , simulando a mudança de fetch_size de 100 para 100K.
Graças a @jjanes, comecei a pesquisar o
fetch_size
disponível a partir de 9.6. Infelizmente, não posso fazer upgrade, então tive que implementar uma solução alternativa. Observandopg_stat_activity
no remoto, noteiFETCH 100 FROM c1
no servidor local, então pensei que fetch_size = 100 provavelmente é codificado em versões anteriores. Então, executei um pequeno resumo para buscar dados com dblink buscado por 100 linhas:Então levou 4235 segundos... Em seguida , aumentei fetch_size no meu wrap-up de 100 para 100*1000 :
Então eu vi
**FETCH 100000 FROM cr**
como esperadopg_stat_activity
e o tempo de execução mudou de 4235 segundos para 90 segundos - que é 40 e poucos vezes!Por último, isso
insert select from postgres_fdw
leva mais ou menos o mesmo tempo que o dblink finaliza com o fetch 100: