根据文档,
使用COPY加载大量行总是比使用INSERT快,即使使用了PREPARE并且多个插入被批处理到单个事务中。
为什么COPY比INSERT更快(多次插入被分批到单个事务中)?
答案 0 :(得分:11)
实际上有很多原因,但主要原因是:
通常,客户端应用程序在发送下一个之前等待确认一个INSERT
的成功。因此,每个INSERT
,调度延迟等都有往返延迟(PgJDBC支持批量管道INSERT
,但我不知道有任何其他客户端这样做。)
每个INSERT
都必须通过整个执行程序。使用预准备语句会绕过运行解析器,重写器和规划器的需要,但仍然存在执行器状态来设置和拆除每一行。 COPY
进行一次设置,并且每行都有极低开销,特别是在没有涉及触发器的情况下。
第一点是最重要的。这都是关于网络往返和重新安排延迟的。
答案 1 :(得分:2)
这是因为COPY
是单个语句,而每个INSERT
是一个单独的语句。由于每个单个语句通常都需要记录(manual),即使在唯一的事务中,使用许多INSERT
也比使用单个COPY
要慢。