将数百批 500k - 300 万条记录插入 PostgreSQL 数据库的最快方法
Quickest way to insert several hundred batches of 500k - 3 million records to PostgreSQL database
我在我们内部网上的虚拟机上托管了一个 PostgreSQL 服务器。在网络的其他地方(这些机器无法访问相同的文件系统)我有 ~850 个 R 脚本 运行(同时),每个脚本生成 50 万到 300 万行数据,我想将这些数据推送到(当前为空)table 在数据库中。我正在尝试确定这样做的最佳方法是什么。到目前为止,我想出了这些解决方案:
使用R odbc和DBI::dbWriteTablepackages/functions将数据推送到远程服务器。作为测试,我尝试同时采用这条路线进行 3 批(约 850 批),这需要约 25 分钟。
将数据导出为文本文件,使用SSH将文本文件复制到托管数据库的服务器,并使用COPY
导入数据
有更好的方法吗?执行此操作的最佳方法是什么?
我试图推送到的 table 已编入索引并具有外键和唯一约束。我在某处读到,在添加数据之前删除这些,然后再将它们添加回去可以显着加快速度。这会产生重大影响吗?
根据我使用大型 PG 数据库的经验,没有什么比在 PG 主机本身上执行 COPY 语句更快的了。如果您在转储文件上放置一些快速 gzip 等,您也将显着加快到该主机的传输速度。最重要的是,您应该禁用所有索引,并在数据库 table 填满后启用它们。所以是的,你的 (2) 是我最喜欢的,在导入时结合了禁用的索引
我在我们内部网上的虚拟机上托管了一个 PostgreSQL 服务器。在网络的其他地方(这些机器无法访问相同的文件系统)我有 ~850 个 R 脚本 运行(同时),每个脚本生成 50 万到 300 万行数据,我想将这些数据推送到(当前为空)table 在数据库中。我正在尝试确定这样做的最佳方法是什么。到目前为止,我想出了这些解决方案:
使用R odbc和DBI::dbWriteTablepackages/functions将数据推送到远程服务器。作为测试,我尝试同时采用这条路线进行 3 批(约 850 批),这需要约 25 分钟。
将数据导出为文本文件,使用SSH将文本文件复制到托管数据库的服务器,并使用
COPY
导入数据
有更好的方法吗?执行此操作的最佳方法是什么?
我试图推送到的 table 已编入索引并具有外键和唯一约束。我在某处读到,在添加数据之前删除这些,然后再将它们添加回去可以显着加快速度。这会产生重大影响吗?
根据我使用大型 PG 数据库的经验,没有什么比在 PG 主机本身上执行 COPY 语句更快的了。如果您在转储文件上放置一些快速 gzip 等,您也将显着加快到该主机的传输速度。最重要的是,您应该禁用所有索引,并在数据库 table 填满后启用它们。所以是的,你的 (2) 是我最喜欢的,在导入时结合了禁用的索引