INSERT和COPY之间的区别

时间:2015-08-17 05:36:53

标签: postgresql bulkinsert

根据文档,

使用COPY加载大量行总是比使用INSERT快,即使使用了PREPARE并且多个插入被批处理到单个事务中。

为什么COPY比INSERT更快(多次插入被分批到单个事务中)?

2 个答案:

答案 0 :(得分:11)

实际上有很多原因,但主要原因是:

  • 通常,客户端应用程序在发送下一个之前等待确认一个INSERT的成功。因此,每个INSERT,调度延迟等都有往返延迟(PgJDBC支持批量管道INSERT,但我不知道有任何其他客户端这样做。)

  • 每个INSERT都必须通过整个执行程序。使用预准备语句会绕过运行解析器,重写器和规划器的需要,但仍然存在执行器状态来设置和拆除每一行。 COPY进行一次设置,并且每行都有低开销,特别是在没有涉及触发器的情况下。

第一点是最重要的。这都是关于网络往返和重新安排延迟的。

答案 1 :(得分:2)

这是因为COPY是单个语句,而每个INSERT是一个单独的语句。由于每个单个语句通常都需要记录(manual),即使在唯一的事务中,使用许多INSERT也比使用单个COPY要慢。