【发布时间】:2018-12-11 19:54:28
【问题描述】:
我总是用这种查询删除重复项:
delete from test a
using test b
where a.ctid < b.ctid
and a.col1=b.col1
and a.col2=b.col2
and a.col3=b.col3
另外,我看到有人使用了这个查询:
DELETE FROM test WHERE test.ctid NOT IN
(SELECT ctid FROM (
SELECT DISTINCT ON (col1, col2) *
FROM test));
甚至这个(重复,直到你用完重复):
delete from test ju where ju.ctid in
(select ctid from (
select distinct on (col1, col2) * from test ou
where (select count(*) from test inr
where inr.col1= ou.col1 and inr.col2=ou.col2) > 1
现在我遇到了一个包含 500 万行的表,其中的列中的索引将在 where 子句中匹配。现在我想知道:
在所有那些显然做同样事情的方法中,哪种方法最有效,为什么? 我只运行第二个,删除重复项需要 45 多分钟。我只是好奇哪个是最有效的,以防我必须从另一个大表中删除重复项。是否有主键并不重要,您始终可以创建它。
【问题讨论】:
-
ctid值的比较很慢,你有另一种唯一标识行的方法吗?也许是serial(或identity)专栏? -
我总是可以创建一个序列号,这没问题。我刚刚在运行 45 分钟后杀死了第二个示例,而第一个示例仅在 50 秒后完成。我很确定他们都删除了重复项,只留下一行。既然两者都做同样的事情,为什么会出现如此巨大的时差?
标签: postgresql duplicates