我有没有 ID 的产品列表(300 万个项目) - 只有标题。但我不知道数据库中已经存在哪些标题。必须将新产品(约 290 万个项目)添加到数据库中。之后,我必须知道每种产品(新的和现有的)的 ID。
在 PostgreSQL 中有最快的方法吗?我可以根据需要更改数据库(添加默认值、添加列等)。
我有没有 ID 的产品列表(300 万个项目) - 只有标题。但我不知道数据库中已经存在哪些标题。必须将新产品(约 290 万个项目)添加到数据库中。之后,我必须知道每种产品(新的和现有的)的 ID。
在 PostgreSQL 中有最快的方法吗?我可以根据需要更改数据库(添加默认值、添加列等)。
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;
ID应serial
使用tbl_id
.tbl
LEFT JOIN
/IS NULL
构造取消现有标题的资格。NOT EXISTS
将是另一种可能性。
DISTINCT
防止临时表中传入数据的重复tmp
。
ANALYZE
有助于确保查询计划器选择一个合理的计划,并且 autovacuum 不会分析临时表。
由于您有 300 万个项目,因此可能需要提高以下设置temp_buffer
(仅限本次会议):
SET temp_buffers = 1000MB;
或者无论你能负担得起多少,并且足以将临时表保存在 RAM 中,这要快得多。注意:必须首先在会话中完成 - 在创建任何临时对象之前。
要查看导入数据的所有 ID:
SELECT tbl.tbl_id, tbl.title
FROM tbl
JOIN tmp USING (title)
在同一个会话中!会话结束时会自动删除一个临时表。