【问题标题】:What is the fastest way to insert rows into a PostgreSQL Database with GeoKettle?使用 GeoKettle 将行插入 PostgreSQL 数据库的最快方法是什么?
【发布时间】:2018-02-08 10:44:33
【问题描述】:

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

【问题讨论】:

    标签: postgresql csv insert pentaho kettle


    【解决方案1】:

    考虑到 PostgreSQL Bulk Loader 运行 COPY table_name FROM STDIN 的事实 - 在 postgres 中加载数据没有什么比这更快的了。多值插入会更慢,只有多个插入会最慢。所以你不能让它更快。

    要加速COPY,您可以:

    set commit_delay to 100000;
    set synchronous_commit to off;
    

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

    注意:

    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

    同步提交(枚举)

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

    (强调我的)

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

    【讨论】:

    • 如果您要建议更改 synchronous_commit 之类的内容,您应该真正解释所涉及的风险......
    • @NickBarnes 感谢您的评论 - 带有警告和一些替代品的更新票证
    猜你喜欢
    • 2016-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-11
    • 2013-04-05
    • 2012-11-27
    • 2022-11-11
    相关资源
    最近更新 更多