将数百批 500k - 300 万条记录插入 PostgreSQL 数据库的最快方法

Posted

技术标签:

【中文标题】将数百批 500k - 300 万条记录插入 PostgreSQL 数据库的最快方法【英文标题】:Quickest way to insert several hundred batches of 500k - 3 million records to PostgreSQL database 【发布时间】:2018-10-30 21:37:59 【问题描述】:

我有一个 PostgreSQL 服务器托管在我们内部网上的虚拟机上。在网络的其他地方(这些机器无法访问相同的文件系统)我有大约 850 个 R 脚本正在运行(同时),每个脚本生成 500k 到 300 万行数据,我想推送到一个(当前为空)数据库中的表。我正在尝试确定这样做的最佳方法是什么。到目前为止,我想出了这些解决方案:

    使用 R odbc 和 DBI::dbWriteTable 包/函数将数据推送到远程服务器。作为测试,我尝试同时采用这条路线进行 3 批(共约 850 批),耗时约 25 分钟。

    将数据导出为文本文件,使用SSH将文本文件复制到托管数据库的服务器,并使用COPY导入数据

有没有更好的方法来做到这一点?最好的方法是什么?

我试图推送到的表已编入索引并具有外键以及唯一约束。我在某处读过,在添加数据之前删除这些,然后再将它们添加回来可以显着加快速度。这会产生重大影响吗?

【问题讨论】:

【参考方案1】:

根据我对大型 PG 数据库的经验,没有什么比 PG 主机本身的 COPY 语句更快的了。如果你在转储文件上放了一些快速的 gzip 或类似的东西,你也会以显着的方式加速到该主机的传输。最重要的是,您应该禁用所有索引,并在数据库表填满后启用它们。所以是的,你的 (2) 是我最喜欢的,在导入时结合了禁用的索引

【讨论】:

有什么方法可以在 PostgreSQL 中使用通配符来复制多个文件,因为我将拥有大约 850 个 tsv 文件。例如。 COPY data FROM '/my/data/*.tsv'; 我们正在使用shell脚本,并调用类似psql < file1.sqlpsql < file2.sql等等。 psql < myfile.tsvCOPY 一样工作吗?或者您是否会在每个 file1.sqlfile2.sql 等中包含单独的 COPY 语句 @Floris 如果 TSV 文件都用于同一个表:cat /my/data/*.tsv | psql 'dbname' -c 'COPY data FROM stdin'

以上是关于将数百批 500k - 300 万条记录插入 PostgreSQL 数据库的最快方法的主要内容,如果未能解决你的问题,请参考以下文章

优化插入数百万条记录,MySQL 和 PHP

mysql如何更快地插入数百万条记录? [关闭]

如何使用 Talend Open Studio 处理数百万条 MongoDB 记录并将其插入 Postgres

使用 hive sql 批量插入数百万条记录到 hive?

Db2 for i - RUNSQLSTM - 插入包含数百万条记录的脚本

表值参数:以小块发送数据