PostgreSQL中INSERT INTO table SELECT和COPY的性能比较

4

我试图在PostgreSQL中处理大量数据(几千万到亿级别的行)。

在设计系统时,我正在尝试理解:INSERT INTO table(field1, field2) SELECT field1, field2 FORM other_tableCOPY FROM ... BINARY在PostgreSQL中的性能比较如何?

我找不到直接回答该问题的任何文档。以下是我可以看到的一些考虑因素:

  • INTO INTO ... SELECT需要从同一磁盘读取和写入
  • COPY FROM ... BINARY要求客户端具有数据,或者执行往返的COPY TO ...管道传输到COPY FROM ...

但我确定还有其他方面需要考虑,希望有一些关于这些比较期望的规范性性能指导。


需要从同一磁盘进行读写操作。这样做可能会互相干扰并导致性能问题,但这实际上取决于您的内核和文件系统的智能程度。这不是 PostgreSQL 可以解决的问题。您需要在自己的系统上尝试并查看结果。 - jjanes
1个回答

1

最终这样的问题只能通过测试来回答。

但是如果你想从一个表复制数据到另一个表,INSERT ... SELECT ...应该会更好,因为它不需要将数据保存到中介文件或通过客户端-服务器连接。

加速提示:

  • 在加载数据时,新表上没有约束和索引,但之后再添加。

  • 确保max_wal_size很高。

之后我会VACUUM(FREEZE)新表(这不会影响表的正常工作),以使未来的反转包装自动清理运行得更快。


2
有一个需要考虑的问题——INSERT ... SELECT是否需要在内存中缓冲整个SELECT查询的结果,还是可以流式传输结果? - Alex Gaynor
2
除非查询中有类似于“ORDER BY”或“DISTINCT”的内容,否则它应该是流式的。 - Laurenz Albe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接