将数百批 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.sql
psql < file2.sql
等等。
psql < myfile.tsv
像COPY
一样工作吗?或者您是否会在每个 file1.sql
、file2.sql
等中包含单独的 COPY
语句
@Floris 如果 TSV 文件都用于同一个表:cat /my/data/*.tsv | psql 'dbname' -c 'COPY data FROM stdin'
以上是关于将数百批 500k - 300 万条记录插入 PostgreSQL 数据库的最快方法的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Talend Open Studio 处理数百万条 MongoDB 记录并将其插入 Postgres