5

我有没有 ID 的产品列表(300 万个项目) - 只有标题。但我不知道数据库中已经存在哪些标题。必须将新产品(约 290 万个项目)添加到数据库中。之后,我必须知道每种产品(新的和现有的)的 ID。

在 PostgreSQL 中有最快的方法吗?我可以根据需要更改数据库(添加默认值、添加列等)。

4

1 回答 1

7

导入数据

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

要查看导入数据的所有 ID:

SELECT tbl.tbl_id, tbl.title
FROM   tbl
JOIN   tmp USING (title)

在同一个会话中!会话结束时会自动删除一个临时表。

于 2013-04-05T13:06:12.643 回答