簡體   English   中英

在postgres中增加3億個條目的最佳方法?

[英]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"

如果可以更改postgres設置,則可以利用Postgres中並行性 否則,您至少可以使用Postgres的批量上傳(也稱為COPY命令)來加快csv的上傳速度。

沒有更多細節,很難給出更好的建議。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM