我有没有ID的产品清单(300万件) - 只有标题。但我不知道DB中已存在哪些标题。必须在DB中添加新产品(约290万件)。之后,我必须知道每种产品的ID(新的和现有的)。
在PostgreSQL中有最快的方法吗?我可以根据需要更改数据库(添加默认值,添加列等)。
答案 0 :(得分:5)
COPY
临时登台表的所有内容,并仅将新标题插入目标表。
CREATE TEMP TABLE tmp(title text);
COPY tmp FROM 'path/to/file.csv';
ANALYZE tmp;
INSERT INTO tbl
SELECT DISTINCT tmp.title
FROM tmp
LEFT JOIN tbl USING (title)
WHERE tbl.title IS NULL;
应使用tbl_id
中的serial
列tbl
自动生成ID。
LEFT JOIN
/ IS NULL
构造取消现有标题的资格。 NOT EXISTS
将是另一种可能性。
DISTINCT
可防止临时表tmp
中的传入数据出现重复。
ANALYZE
有助于确保查询计划程序选择合理的计划,并且autovacuum不会分析临时表。
由于您有300万件商品,因此提高temp_buffer
的设置(此会话的仅)可能需要付费:
SET temp_buffers = 1000MB;
或者你可以承受多少钱并且足以将临时表保存在RAM中,这要快得多。注意:必须在会话中 first - 在创建任何临时对象之前完成。
查看导入数据的所有ID:
SELECT tbl.tbl_id, tbl.title
FROM tbl
JOIN tmp USING (title)
在同一个会话中!会话结束时会自动删除临时表。