PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

desempenho em lote jdbc


AFAIK não é um lote do lado do servidor no fe/be protocolo , então o PgJDBC não pode usá-lo. . Atualizar :Bem, eu estava errado. PgJDBC (preciso em 9.3) faz enviar lotes de consultas para o servidor se ele não precisar buscar as chaves geradas . Ele apenas enfileira um monte de consultas no buffer de envio sem sincronizar com o servidor após cada consulta individual.

Ver:

Mesmo quando as chaves geradas são solicitadas, a consulta estendida protocolo é usado para garantir que o texto da consulta não precise ser enviado todas as vezes, apenas os parâmetros.

Francamente, o lote JDBC não é uma ótima solução em qualquer caso. É fácil de usar para o desenvolvedor de aplicativos, mas muito abaixo do ideal para desempenho, pois o servidor ainda precisa executar cada instrução individualmente - embora não parse e planejar individualmente, desde que você use declarações preparadas.

Se o autocommit estiver ativado, o desempenho será absolutamente patético porque cada instrução aciona um commit. Mesmo com o autocommit desligado, muitas pequenas instruções não serão particularmente rápidas, mesmo se você puder eliminar os atrasos de ida e volta.

Uma solução melhor para muitos UPDATE simples s pode ser:
  • COPY novos dados em um TEMPORARY ou UNLOGGED tabela; e
  • Usar UPDATE ... FROM para UPDATE com um JOIN contra a tabela copiada

Para COPY, consulte os documentos do PgJDBC e o COPY documentação nos documentos do servidor .

Muitas vezes você descobrirá que é possível ajustar as coisas para que seu aplicativo não precise enviar todos esses UPDATE individuais s em tudo.