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

时间:2010-08-09 04:46:38

标签: sql database postgresql performance

我有一个如下所示的数据结构:

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小时才能在我的AMD Turion64x2 CPU上导入 ~4百万行。操作系统是Gentoo~amd64,PostgreSQL是8.4版,本地编译。数据目录是一个绑定挂载,位于我的第二个扩展分区(ext4)上,我认为这不是瓶颈。

我怀疑插入外键关系需要这么长时间,因为psql会检查每一行的键约束,这可能会增加一些不必要的开销,因为我确信数据是有效的。有没有办法加快导入速度,即暂时禁用约束检查?

2 个答案:

答案 0 :(得分:16)

  1. 确保两个外键约束都是DEFERRABLE
  2. 使用COPY加载数据
  3. 如果您无法使用COPY,请使用prepared statement作为INSERT。
  4. Propper配置设置也会有所帮助,请检查WAL设置。

答案 1 :(得分:0)

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

嗯...也许那篇文章不适用于你的情况?似乎我们已经能够set constraints to deferred一段时间......我猜这种独特是一种独特的情况(双关语)。