INSERT 和 COPY 的区别
Difference between INSERT and COPY
根据文档,
使用 COPY 加载大量行总是比使用 INSERT 更快,即使使用 PREPARE 并将多个插入分批处理到单个事务中也是如此。
为什么 COPY 比 INSERT 快(多次插入被批量合并到单个事务中)?
这是因为 COPY
是一个单独的语句,而每个 INSERT
是一个单独的语句。由于每个单独的语句通常都受到日志记录 (manual),即使在一个唯一的事务中,使用许多 INSERT
比使用单个 COPY
.[=15= 慢]
其实有很多原因,但最主要的是:
通常,客户端应用程序会等待一个 INSERT
成功的确认,然后再发送下一个。所以每个 INSERT
都有一个往返延迟,调度延迟等。(PgJDBC 支持批量流水线 INSERT
s,但我不知道有任何其他客户端这样做)。
每个INSERT
都要经过整个executor。使用准备好的语句绕过了 运行 解析器、重写器和规划器的需要,但仍然需要为每一行设置和拆除执行器状态。 COPY
进行一次设置,并且每行的开销 极低 ,尤其是在不涉及触发器的情况下。
第一点最为重要。这都是关于网络往返和重新安排延迟。
根据文档,
使用 COPY 加载大量行总是比使用 INSERT 更快,即使使用 PREPARE 并将多个插入分批处理到单个事务中也是如此。
为什么 COPY 比 INSERT 快(多次插入被批量合并到单个事务中)?
这是因为 COPY
是一个单独的语句,而每个 INSERT
是一个单独的语句。由于每个单独的语句通常都受到日志记录 (manual),即使在一个唯一的事务中,使用许多 INSERT
比使用单个 COPY
.[=15= 慢]
其实有很多原因,但最主要的是:
通常,客户端应用程序会等待一个
INSERT
成功的确认,然后再发送下一个。所以每个INSERT
都有一个往返延迟,调度延迟等。(PgJDBC 支持批量流水线INSERT
s,但我不知道有任何其他客户端这样做)。每个
INSERT
都要经过整个executor。使用准备好的语句绕过了 运行 解析器、重写器和规划器的需要,但仍然需要为每一行设置和拆除执行器状态。COPY
进行一次设置,并且每行的开销 极低 ,尤其是在不涉及触发器的情况下。
第一点最为重要。这都是关于网络往返和重新安排延迟。