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

时间:2018-10-30 21:37:59

标签: postgresql rodbc r-dbi

我的Intranet上的VM上托管了一个PostgreSQL服务器。在网络中的其他地方(这些机器无法访问相同的文件系统),我同时运行着约850个R脚本,它们分别生成500k至300​​万行的数据,我希望将其推送到(当前为空)数据库中的表。我正在尝试确定这样做的最佳方法。到目前为止,我想出了这些解决方案:

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

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

是否有更好的方法可以做到这一点?最好的方法是什么?

我要推送到的表已建立索引并具有外键以及唯一约束。我读过某个地方的文章,在添加数据之前先删除它们,然后再添加回它们可以大大加快处理速度。这会产生重大变化吗?

1 个答案:

答案 0 :(得分:3)

根据我对大型PG数据库的经验,在PG主机本身上没有比COPY语句更快的速度了。如果在转储文件上放置一些快速的gzip或类似的文件,则也将大大加快向该主机的传输。最重要的是,您应该禁用所有索引,并在数据库表填满后启用它们。是的,您的(2)是我的最爱,在导入时结合了禁用的索引