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

Att*_* O. 10 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 ...
Run Code Online (Sandbox Code Playgroud)

我在模型表中有超过500万行,我需要在两个外键表中插入约5000万行.我有这样的SQL文件:

INSERT INTO place_belongtos (from_place_id, to_place_id) VALUES (123, 456);
Run Code Online (Sandbox Code Playgroud)

它们各约为7 Gb.问题是,当我这样做时psql < belongtos.sql,在我的AMD Turion64x2 CPU上导入约400万行需要大约12个小时.操作系统是Gentoo~amd64,PostgreSQL是8.4版,本地编译.数据目录是一个绑定挂载,位于我的第二个扩展分区(),我认为这不是瓶颈.ext4

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

Fra*_*ens 16

  1. 确保两个外键约束都是DEFERRABLE
  2. 使用COPY加载数据
  3. 如果您不能使用COPY,请为INSERT 使用预准备语句.
  4. Propper配置设置也会有所帮助,请检查WAL设置.

  • COPY +1,对我经常运行的数据库产生巨大影响,定期插入大量数据... (4认同)
  • 删除索引,约束和触发器,然后在导入完成后重建它们甚至可能有意义. (4认同)