O
pushLog
A função confirma cada inserção separadamente e a confirmação é lenta. Conforme explicado na documentação Populando um banco de dados :
Também:
No seu caso, no entanto, isso seria um problema e não um benefício, porque cada INSERT pode falhar na violação de chave primária, cancelando os INSERTs anteriores desde o último commit. Observe que isso também seria um problema com
COPY , você deve usar isso.
Como é realmente necessário agrupar consultas em transações para desempenho, você precisa lidar com violações de chave primária de uma forma que não anule a transação.
Dois métodos são normalmente usados:
-
Evite o erro:INSERT INTO... WHERE NOT EXISTS (SELECT 1 FROM table WHERE primary_key=...)
-
Capturar o erro inserindo dentro de uma função plpgsql que possui um bloco EXCEPTION ignorando itr. O(s) INSERT(s) específico(s) causando uma duplicata será(ão) cancelado(s), mas a transação não será abortada.
Se você tiver inserções simultâneas, esses métodos precisam ser refinados com uma estratégia de bloqueio.