INSERT 和 COPY 的区别

Difference between INSERT and COPY

根据文档,

使用 COPY 加载大量行总是比使用 INSERT 更快,即使使用 PREPARE 并将多个插入分批处理到单个事务中也是如此。

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

这是因为 COPY 是一个单独的语句,而每个 INSERT 是一个单独的语句。由于每个单独的语句通常都受到日志记录 (manual),即使在一个唯一的事务中,使用许多 INSERT 比使用单个 COPY.[=15= 慢]

其实有很多原因,但最主要的是:

  • 通常,客户端应用程序会等待一个 INSERT 成功的确认,然后再发送下一个。所以每个 INSERT 都有一个往返延迟,调度延迟等。(PgJDBC 支持批量流水线 INSERTs,但我不知道有任何其他客户端这样做)。

  • 每个INSERT都要经过整个executor。使用准备好的语句绕过了 运行 解析器、重写器和规划器的需要,但仍然需要为每一行设置和拆除执行器状态。 COPY 进行一次设置,并且每行的开销 极低 ,尤其是在不涉及触发器的情况下。

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