【发布时间】: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