[英]best way to upsert 300 million entries into postgres?
我每天都有一個新的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個表-餐館(名稱,food_id,street_id,創建日期,lastdayobservedopen)以及pk(名稱,street_id)和fks(food_id和street_id); 帶有pk(food_id)和food_type索引的食品類型(food_id,food_type); 帶有pk(street_id)的位置(street_id,street_name)和street_name上的索引; 至於csv文件,我不知道是新條目還是舊條目,但是我知道大多數條目已經在數據庫中,這將需要我更新上次觀察的日期。 其余的將以觀察到的最后日期為今天插入。 這樣做可以幫助區分不再營業的餐廳(在這種情況下,“ lastdayobserved”列將不會更新)和當前營業的餐廳,該餐廳的日期應始終與今天的日期匹配。 也可以接受更有效的模式建議。 謝謝大家!
sql中有一個稱為批量插入的函數,可以處理大量數據:
bulk insert #temp
from "file location path"
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.