使用GeoKettle将行插入PostgreSQL数据库的最快方法是什么?

时间:2018-02-08 10:44:34

标签: postgresql csv insert pentaho kettle

假设我有一个包含1亿行的.csv文件。我将该csv文件导入pentaho Kettle,并希望将所有行写入PostgreSQL数据库。什么是最快的插入转换?我尝试过普通的表输出转换和PostgreSQL批量加载器(比表输出快)。但是,它太慢了。有没有比使用PostgreSQL批量加载器更快的方法?

1 个答案:

答案 0 :(得分:1)

考虑到PostgreSQL批量加载程序运行COPY table_name FROM STDIN这一事实 - 在postgres中,数据加载并没有更快的速度。多值插入将更慢,只需多次插入将是最慢的。所以你不能让它更快。

为了加快COPY你可以:

set commit_delay to 100000;
set synchronous_commit to off;

和其他服务器端技巧(如加载前删除索引)。

NB:

very old but still relevant depesz post

most probably won't work with pentaho Kettle,but worth of checking pgloader

<强>更新

https://www.postgresql.org/docs/current/static/runtime-config-wal.html

  

synchronous_commit(enum)

     

指定事务提交是否等待WAL记录   在命令返回“成功”指示之前写入磁盘   客户端。有效值为on,remote_apply,remote_write,local,   然后关闭默认且安全的设置已启用。关闭时,可以   在向客户报告成功与何时报告成功之间的延迟   事务确保对服务器崩溃是安全的。   (最大延迟是wal_writer_delay的三倍。)与fsync不同,   将此参数设置为off不会产生任何数据库风险   不一致:可能导致操作系统或数据库崩溃   最近一些据称承诺的交易丢失了,但是   数据库状态与这些事务的状态相同   干净地流产。因此,关闭synchronous_commit可能很有用   当绩效比确切的确定性更重要时   关于交易的持久性。

(强调我的)

另请注意,我建议在会话级别使用SET,因此如果GeoKettle在postgres上运行命令之前不允许设置配置,则可以使用pgbouncer connect_query用户/数据库对,或者想一些其他技巧。如果您无法在每个会话中设置synchronous_commit并且您决定按照数据库或用户更改它(因此它将应用于GeoKettle连接,请不要忘记将其设置为加载结束后on