sql - 如何将*大*数据 block 导入 PostgreSQL?

标签 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 上导入 ~400 万 行。 OS为Gentoo~amd64,PostgreSQL为8.4版本,本地编译。数据目录是一个绑定(bind)挂载,位于我的第二个扩展分区 ( ext4 ) 上,我认为这不是瓶颈。

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

最佳答案

  1. 确保两个外键约束都是 DEFERRABLE
  2. 使用COPY加载您的数据
  3. 如果您不能使用 COPY,请使用 prepared statement为您的插入。
  4. 适当的配置设置也有帮助,检查 WAL设置。

关于sql - 如何将*大*数据 block 导入 PostgreSQL?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3437398/

相关文章:

sql - 在 SQL 连接的情况下如何将 SQL 转换为关系代数?

SQL 超时已过期

postgresql - 在 postgreSQL 中连接三个外部表

sql - 使用 Sphinx 进行简单的标签搜索

php - 从 sql 获取前 12 个月

mysql - dll MATLAB,dll DBMS,blob?

java - 如何在 PreparedStatement 中使用多个可选参数填充查询 sql?

mysql - 如何删除除最新的 50 行之外的所有行

mysql - 在sql中合并2个或多个表

postgresql - Korma 和 Postgresql 的默认 ID?