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

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

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

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

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

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

【问题讨论】:

    标签: postgresql rodbc r-dbi


    【解决方案1】:

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

    【讨论】:

    • 有什么方法可以在 PostgreSQL 中使用通配符来复制多个文件,因为我将拥有大约 850 个 tsv 文件。例如。 COPY data FROM '/my/data/*.tsv';
    • 我们正在使用shell脚本,并调用类似psql < file1.sqlpsql < file2.sql等等。
    • psql < myfile.tsv 像COPY 一样工作吗?或者您是否会在每个 file1.sql、file2.sql 等中包含单独的 COPY 语句
    • @Floris 如果 TSV 文件都用于同一个表:cat /my/data/*.tsv | psql 'dbname' -c 'COPY data FROM stdin'
    猜你喜欢
    • 1970-01-01
    • 2020-08-10
    • 2012-05-30
    • 2021-12-19
    • 2015-09-04
    • 2020-10-31
    • 1970-01-01
    • 2023-01-31
    • 1970-01-01
    相关资源
    最近更新 更多