假设我有一个有1亿行的..csv文件。我将csv-文件导入宾得凯特尔,并希望将所有行写入PostgreSQL数据库。什么是最快的插入-转换?我已经尝试过正常的表输出转换和PostgreSQL大容量加载器(这比表输出快得多)。但是,它还是太慢了。有比使用PostgreSQL大容量装载机更快的方法吗?
发布于 2018-02-08 12:17:43
考虑到PostgreSQL大容量装载机运行COPY table_name FROM STDIN这一事实,在postgres中没有什么比加载数据更快的了。多值插入将更慢,只是多个插入将是最慢的.所以你不能让它更快。
要加速COPY,您可以:
set commit_delay to 100000;
set synchronous_commit to off;和其他服务器端技巧(比如在加载之前删除索引)。
注:
更新
https://www.postgresql.org/docs/current/static/runtime-config-wal.html
synchronous_commit (enum) 指定事务提交是否等待将WAL记录写入磁盘,然后命令将“成功”指示返回给客户端。有效值是on、remote_apply、remote_write、local和off。默认的和安全的设置是打开的。关闭时,在向客户端报告成功时到事务确实能够安全地防止服务器崩溃之间可能会出现延迟。(最大延迟是wal_writer_delay的三倍。)与fsync不同,将此参数设置为off不会造成任何数据库不一致的风险:操作系统或数据库崩溃可能会导致最近一些据称提交的事务丢失,但数据库状态将与那些事务被彻底中止一样。因此,当性能比事务持久性的确切确定性更重要时,关闭synchronous_commit可能是一种有用的替代方案。
(强调地雷)
还请注意,我建议在会话级别使用SET,因此如果GeoKettle不允许在postgres上运行命令之前设置配置,则可以对特定的用户/数据库对使用弹跳员 connect_query,或者考虑其他一些技巧。如果您不能做任何事情来设置每个会话的synchronous_commit,并且决定根据每个数据库或用户更改它(因此它将应用于GeoKettle连接),请不要忘记在加载结束后将其设置为on。
https://stackoverflow.com/questions/48683563
复制相似问题