代码之家  ›  专栏  ›  技术社区  ›  Attila O.

如何将*大*块数据导入PostgreSQL?

  •  10
  • Attila O.  · 技术社区  · 14 年前

    我的数据结构如下:

    Model Place
        primary key "id"
    
        foreign key "parent" -> Place
        foreign key "neighbor" -> Place (symmetryc)
        foreign key "belongtos" -> Place (asymmetric)
    
        a bunch of scalar fields ...
    

    模型表中有超过500万行,需要插入 ~ 5000万 两个外键表中的每一个的行。我有 SQL 像这样的文件:

    INSERT INTO place_belongtos (from_place_id, to_place_id) VALUES (123, 456);
    

    它们是关于 7 GB 每一个。问题是,当我这样做的时候 psql < belongtos.sql ,这需要我大约 12小时 进口 ~ 400万 AMD Turion64x2 CPU上的行。OS为gentoo~amd64,PostgreSQL为8.4版,本地编译。data dir是一个绑定装载,位于我的第二个扩展分区上( ext4 我认为这不是瓶颈。

    我怀疑插入外交关系要花这么长时间,因为 psql 检查每一行的键约束,这可能会增加一些不必要的开销,正如我所知道的,以确保数据是有效的。是否有方法加速导入,即临时禁用约束检查?

    2 回复  |  直到 13 年前
        1
  •  16
  •   Frank Heikens    14 年前
    1. 确保两个外键约束都是 DEFERRABLE
    2. 使用 COPY 加载数据
    3. 如果不能使用copy,请使用 prepared statement 为你的插入。
    4. Propper配置设置也会有帮助,请检查 WAL 设置。
        2
  •  0
  •   xenoterracide    14 年前

    答案是肯定的… Depesz wrote an article here on deferrable uniqueness . 不幸的是,它似乎是一个9.0功能。

    隐马尔可夫模型。。。也许那篇文章不适用于你的情况?看来我们能 set constraints to deferred 有一阵子…我猜独特是一种独特的情况(双关语是故意的)。