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 / 224477
Accepted
d4nielfr4nco
d4nielfr4nco
Asked: 2018-12-09 09:07:42 +0800 CST2018-12-09 09:07:42 +0800 CST 2018-12-09 09:07:42 +0800 CST

Implicações de upsert do PostgreSQL no desempenho de leitura após carregamento em massa

  • 772

Na documentação do PostgreSQL sobre preenchimento de bancos de dados, eles mencionam como podemos melhorar as operações de carregamento em massa desabilitando restrições e índices, mas vendo como INSERT ... ON CONFLICT (upsert) requer o uso de uma restrição exclusiva para funcionar, e isso faz todo o sentido, Eu estive me perguntando o quão boa é a seguinte estratégia:

  1. Crie várias conexões para carregar dados em lotes em paralelo em uma tabela de teste não registrada

  2. Crie restrições adiadas para fazer validação de integridade nos dados da tabela

  3. Faça o upsert dos dados de preparo em uma grande tabela de destino (5 GB+), que também precisaria ter um PK, índice exclusivo ou restrição exclusiva para possibilitar o upsert.

A abordagem de inserção em conflito é conhecida por ser melhor do que criar manualmente funções SQL ou scripts para unir as duas tabelas para descobrir os "novos registros" a serem inseridos e os "registros comuns" a serem atualizados. Esse é o motivo pelo qual INSERT ... ON CONFLICT existe.

No entanto, ainda estou me perguntando as implicações de desempenho para ler os dados após carregá-los.

Perguntas:

  1. Em termos de inchaço do índice, um upsert seria pior do que simples inserções de cópia em massa + atualização para uma tabela sem restrições? O upsert é ruim para a manutenção do índice?

  2. Se for esse o caso, acredito que carregamentos mais rápidos também implicariam em um desempenho de consulta ruim após o carregamento da tabela. Devo recriar os índices após INSERT ... ON CONFLICT?

  3. Comparado com INSERT ... ON CONFLICT, a forma de função/script de fazer isso, embora com menos desempenho para cargas, seria melhor para manutenção de índice, pois a tabela de destino não precisa ter um índice para fazer o upserting?

postgresql
  • 1 1 respostas
  • 2787 Views

1 respostas

  • Voted
  1. Best Answer
    jjanes
    2018-12-09T12:48:15+08:002018-12-09T12:48:15+08:00

    Esse é o motivo pelo qual INSERT ... ON CONFLICT existe.

    Não acho que seja esse o caso. Eu acho que um ponto muito importante foi uma conveniência para que as pessoas não precisem implementar um loop catch and retry para violações de restrição exclusivas em inserções de linha única. Não reverter inserções em massa inteiras devido a algumas violações também é uma melhoria muito boa, mas não acho que seja o ponto principal . E se você vai ter a tabela offline para outros usos de qualquer maneira, acho que na verdade não é o objetivo de ON CONFLICT.

    ON CONFLICT paga um preço alto para lidar com a concorrência em um nível refinado. Se você pode garantir que apenas este procedimento está inserindo novos registros, então uma consulta para fazer a inserção de novas chaves e uma segunda consulta para fazer a atualização das antigas quase certamente seriam mais eficientes do que usar ON CONFLICT. Se o seu ponto 3 significa que a tabela grande teve todas as restrições e índices descartados, exceto o necessário para suportar o ON CONFLICT, então parece provável que você esteja em uma janela de manutenção e, portanto, provavelmente pode garantir que não haja inserções simultâneas.

    Em termos de inchaço do índice, um upsert seria pior do que simples inserções de cópia em massa + atualização para uma tabela sem restrições? O upsert é ruim para a manutenção do índice?

    Eu não esperaria que esse fosse o caso em geral, se você mantiver a restrição exclusiva de qualquer maneira. Mas isso dependeria de coisas como se os valores de chave exclusivos das linhas que estão sendo inseridas estão ocorrendo principalmente em ordem ou aleatórios. Além disso, bloat dependeria se as linhas que seguem o caminho UPDATE têm espaço para a linha atualizada no mesmo bloco em que a versão antiga residia originalmente (portanto, o fator de preenchimento da tabela), mas isso também seria verdade se o UPDATE fosse uma instrução separada . Você teria que simular algo semelhante às suas condições reais e testá-lo para obter respostas claras.

    Comparado com INSERT ... ON CONFLICT, o modo função/script de fazer isso, embora com menor desempenho para cargas, seria melhor para manutenção de índice, pois a tabela de destino não precisa ter um índice para fazer o upserting?

    Se você colocar a tabela offline para uso normal e descartar todas as restrições e índices, ela deverá ter mais desempenho e levar a índices menos inchados (embora talvez apenas um pouco menos inchados) depois de reconstruí-los. Esse é o caso se você comparar com o uso do ON CONFLICT online ou com a eliminação de todas as restrições, exceto uma, e a execução do ON CONFLICT offline.

    • 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