INSERT INTO 表 SELECT 与 COPY 的 PostgreSQL 性能

标签 postgresql performance

我正在尝试在 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 ...

但我敢肯定还有其他人,我希望有某种形式的规范性能指导围绕这些比较期望。

最佳答案

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

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

速度提示:

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

  • 确保 max_wal_size 较高。

之后我会VACUUM (FREEZE) 新表(这不会影响表上的正常工作)以使 future 的反环绕 autovacuum 运行得更快。

关于INSERT INTO 表 SELECT 与 COPY 的 PostgreSQL 性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58307074/

相关文章:

c - 长度为 8 的结构和 uint64_t 的效率

performance - 给定 a 和 p 是 n 位数字,mod p 的大 O 运行时间是多少?

javascript - 如何创建逆向 react 门户

linux - 使用 psycopg2 时重新声明游标会创建新连接吗?

php - "Bad"练习乘以$val * 1 将null 转换为零

ruby-on-rails - 请安装 postgresql 适配器 : `gem install activerecord-postgresql-adapter`

sql - 插入语句在函数内部不起作用(PostgreSQL)

postgresql - 在具有 ID 的多个列中查找具有相同值的行

C# byte[] 没有边界检查的比较

sql - 降序排序索引