删除重复记录(有效)

时间:2018-08-02 04:27:17

标签: postgresql

PostgreSQL 10.4

我有一张桌子:

Column   | Type
-------------------------
 id      | integer| 
 title   | character varying(200)
Indexes:
    "phrases_pkey" PRIMARY KEY, btree (id)
    "phrases_index" btree (title)

内容如下:

rinopt=# select count(distinct title) from phrases;
  count  
---------
 9787866
(1 строка)

rinopt=# select count(title) from phrases;
  count   
----------
 13573099
(1 строка)

我只想保留不同的记录:

delete from phrases where phrases.id not in (
    select id from (
        select distinct on (title) * from phrases
    ) as phrases_id
)

好吧,该命令已经运行了16个小时,我无法预测它何时完成。

近1400万条记录不是一个很小的数据库,但也不是难以想象的。看来我的选择陈述效率很低。

您能告诉我是否有可能写出更优化的命令来清理重复项吗?

1 个答案:

答案 0 :(得分:0)

一个子选择就足够了。您可能会删除ID大于当前名称且标题相等的短语:

DELETE FROM phrases p WHERE EXISTS (
    SELECT p1.id FROM phrases p2 WHERE p.title = p2.title AND p.id > p2.id
);

类似JOIN的删除也是可能的:

DELETE FROM phrases p USING phrases p2 WHERE p.title = p2.title AND p.id > p2.id;

两个语句都应保留每个标题的ID最少的短语。