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