AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 165329
Accepted
Vao Tsun
Vao Tsun
Asked: 2017-02-24 08:11:21 +0800 CST2017-02-24 08:11:21 +0800 CST 2017-02-24 08:11:21 +0800 CST

postgres_fdw mais lento do que copiar + scp + copiar (~ 12 vezes)

  • 772
  • 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:

    1. copiar para - 2:36
    2. scp - 08:17
    3. copiar de - 10:11
  • postgres_fdw:

    1. quando o old way terminou, ele fez 800 MB deinsert into .. select * from foreign_table

Perdi algo na configuração (o que significa que posso melhorá-lo) ou postgres_fdwsimplesmente 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_sizeopção, não disponível antes de 9.6, pode ser simulada dblink_fetch(CURSOR, fetch_size)- veja minha resposta abaixo.

postgresql bulk
  • 2 2 respostas
  • 2004 Views

2 respostas

  • Voted
  1. Best Answer
    jjanes
    2017-02-24T10:21:01+08:002017-02-24T10:21:01+08:00

    postgres_fdw certamente não é tão otimizado para transferência em massa quanto copy to, copy from, e scpsã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.

    • 4
  2. Vao Tsun
    2017-03-01T08:24:46+08:002017-03-01T08:24:46+08:00

    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_sizedisponível a partir de 9.6. Infelizmente, não posso fazer upgrade, então tive que implementar uma solução alternativa. Observando pg_stat_activityno remoto, notei FETCH 100 FROM c1no 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:

    truncate table bin.t1;
    begin;
    do
    $$
    declare
     _r record;
    begin
      perform dblink_connect('past');
      perform dblink_exec('BEGIN;');
      perform dblink_open('cr', 'select * from rel');
    
      for _r in 0..130*1000 loop /* I know the number of rows is apxm 130*1000*100*/
        raise info '%',concat(lpad(_r::text,4,'0'),': ',clock_timestamp());
        insert into bin.t1
          SELECT * FROM dblink_fetch('cr', 100) 
            AS (a integer, b character varying(200), c double precision)
        ;
      end loop;
    
      perform dblink_close('cr');
      perform dblink_exec('END;');
      perform dblink_disconnect();
    end;
    $$
    ;
    end;
    DO
    Time: 4235292.205 ms
    db=# end;
    COMMIT
    Time: 89.988 ms
    db=# select count(1) from bin.t1;
      count
    ----------
     12309947
    (1 row)
    

    Então levou 4235 segundos... Em seguida , aumentei fetch_size no meu wrap-up de 100 para 100*1000 :

    truncate table bin.t2;
    begin;
    do
    $$
    declare
     _r record;
    begin
      perform dblink_connect('past');
      perform dblink_exec('BEGIN;');
      perform dblink_open('cr', 'select * from rel');
    
      for _r in 0..130 loop
        raise info '%',concat(lpad(_r::text,4,'0'),': ',clock_timestamp());
        insert into bin.t2
          SELECT * FROM dblink_fetch('cr', 100*1000) 
            AS (a integer, b character varying(200), c double precision)
        ;
      end loop;
    
      perform dblink_close('cr');
      perform dblink_exec('END;');
      perform dblink_disconnect();
    end;
    $$
    ;
    end;
    DO
    Time: 89606.764 ms
    db=# end;
    COMMIT
    Time: 0.153 ms
    db=# select count(1) from bin.t2;
    -[ RECORD 1 ]---
    count | 12309947
    

    Então eu vi **FETCH 100000 FROM cr**como esperado pg_stat_activitye o tempo de execução mudou de 4235 segundos para 90 segundos - que é 40 e poucos vezes!

    Por último, isso insert select from postgres_fdwleva mais ou menos o mesmo tempo que o dblink finaliza com o fetch 100:

    db=# insert into bin.t3 select * from remote.rel;
    INSERT 0 12296752
    Time: 5321428.694 ms
    
    • 2

relate perguntas

  • Posso ativar o PITR depois que o banco de dados foi usado

  • Práticas recomendadas para executar a replicação atrasada do deslocamento de tempo

  • Os procedimentos armazenados impedem a injeção de SQL?

  • Sequências Biológicas do UniProt no PostgreSQL

  • Qual é a diferença entre a replicação do PostgreSQL 9.0 e o Slony-I?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve