【问题标题】:best way to upsert 300 million entries into postgres?将 3 亿个条目插入 postgres 的最佳方法?
【发布时间】:2019-07-22 00:29:40
【问题描述】:

我每天都有一个新的csv 文件,其中包含 4 亿多个条目,我需要将这些条目插入到我的数据库中(3 个具有 2 个外键的表,已编入索引)。大多数条目已经在表中,在这种情况下,我需要更新一列。需要插入一些尚未在表中的条目。

我尝试每天将 CSV 插入 temptable 然后运行:

INSERT INTO restaurants (name, food_id, street_id, datecreated, lastdayobservedopen) SELECT DISTINCT temptable.name, typesoffood.food_id, location.street_id, temptable.datecreated, temptable.lastdayobservedopen FROM temptable INNER JOIN typesoffood on typesoffood.food_type = temptable.food_type INNER JOIN location ON location.street_name = temptable.street_name ON CONFLICT ON CONSTRAINT restaurants_pk DO UPDATE SET lastdayobservedopen = EXCLUDED.lastdayobservedopen

但需要 6 多个小时。

有没有可能让它更快?

编辑:

更多细节:3 个表 - 带有 pk(名称、street_id)和 fks(food_id 和 street_id)的餐厅(名称、food_id、street_id、datecreated、lastdayobservedopen); typesoffood(food_id, food_type) 带有 pk (food_id) 和 food_type 上的索引; location(street_id, street_name) 与 pk (street_id) 和 street_name 上的索引;至于 csv 文件,我不知道哪些是新条目或旧条目,但我知道大多数条目已经在数据库中,这需要我更新 lastdayobserved 日期。其余的将插入 lastdayobserved 日期作为今天。这应该有助于区分不再营业的餐厅(在这种情况下,他们的 lastdayobserved 列不会更新)和当前营业的餐厅,其日期应始终与今天的日期匹配。也可以接受更有效的模式建议。谢谢大家!

【问题讨论】:

  • 没有任何技术细节,唯一可以给出的建议是获得一台更快的机器。
  • 能否请您提供更多详细信息,例如表是否会出现几分钟的停机时间以及通常何时发生负载,基于此我们可以有一个更快的解决方案?
  • @blueberry12 。 . .我猜你有很多相同的值没有被过滤掉。将其分成两个查询可能更简单,只有需要更新的行,然后只有需要插入的行。
  • Gordon,这是真的,但是我如何过滤掉新的和已经存在的值以便分成两个查询?谢谢!

标签: python sql postgresql psycopg2


【解决方案1】:

sql中有一个函数叫bulk insert,可以处理大量数据:

bulk insert #temp
from "file location path"

【讨论】:

    【解决方案2】:

    如果您可以更改 postgres 设置,则可以利用 parallelism in Postgres。否则,您至少可以使用 Postgres 的批量上传加速 csv 上传,也称为 COPY command

    没有更多细节,很难给出更好的建议。

    【讨论】:

    • 所以复制到 temptable 不是瓶颈。然后它会尝试将所有可诱惑的条目插入到模式中。谢谢您的帮助!我将研究并行性。
    猜你喜欢
    • 2015-10-16
    • 2011-02-02
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    • 2012-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多