Muitas razões, na verdade, mas as principais são:
-
Normalmente, os aplicativos cliente aguardam a confirmação de umINSERT's sucesso antes de enviar o próximo. Portanto, há um atraso de ida e volta para cadaINSERT, atrasos de agendamento, etc. (PgJDBC suporta pipelineINSERTs em lotes, mas não conheço nenhum outro cliente que o faça).
-
CadaINSERTtem que passar por todo o executor. O uso de uma instrução preparada ignora a necessidade de executar o analisador, o reescritor e o planejador, mas ainda há o estado do executor para configurar e desmontar para cada linha.COPYfaz alguma configuração uma vez, e tem um extremamente baixa sobrecarga para cada linha, especialmente quando não há gatilhos envolvidos.
O primeiro ponto é o mais significativo. É tudo sobre viagens de ida e volta da rede e atrasos de reprogramação.