我有一个如下所示的数据结构:
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 上导入 ~400 万 行。 OS为Gentoo~amd64,PostgreSQL为8.4版本,本地编译。数据目录是一个绑定(bind)挂载,位于我的第二个扩展分区 ( ext4
) 上,我认为这不是瓶颈。
我怀疑插入外键关系需要这么长时间,因为 psql
检查每一行的键约束,这可能会增加一些不必要的开销,因为我确信数据是有效的。有没有办法加快导入速度,即暂时禁用约束检查?
最佳答案
- 确保两个外键约束都是 DEFERRABLE
- 使用COPY加载您的数据
- 如果您不能使用 COPY,请使用 prepared statement为您的插入。
- 适当的配置设置也有帮助,检查 WAL设置。
关于sql - 如何将*大*数据 block 导入 PostgreSQL?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3437398/