Pular para conteúdo

0007 — COPY + TEMP TABLE no upsert em lote

Status: Aprovado · Responsável: Gustavo Madruga · Atualizado em: 2026-06-11 · Decidido em: 2026-05-08

Contexto

O UPSERT diff-aware (ver decisão 0006) precisa ser aplicado em lote sobre milhares de linhas por upload, com boa performance.

Decisão

O caminho de upsert em lote faz COPY → TEMP TABLE → UPSERT → DELETE: carrega o lote na temp table via COPY (rápido), depois aplica o UPSERT diff-aware e o DELETE seletivo a partir dela.

Consequências

  • COPY é a via mais rápida do Postgres para cargas grandes.
  • Diverge tecnicamente do Comercial, que usa PreparedStatement.executeBatch — lá isso é necessário para preservar o rowCount per-row da métrica linhas_efetivas. Aqui as métricas finas vêm por tabela, de outra forma.
  • Filosoficamente, os dois fazem a mesma coisa (diff-aware); a técnica difere por um motivo legítimo de cada domínio.

Alternativas consideradas

  • executeBatch (como o Comercial): preserva rowCount per-row, mas é mais lento no volume deste projeto e não traz vantagem aqui. Descartado.
  • INSERT linha a linha: inviável na escala dos uploads reais. Descartado.