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万条记录不是一个很小的数据库,但也不是难以想象的。看来我的选择陈述效率很低。
您能告诉我是否有可能写出更优化的命令来清理重复项吗?
答案 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最少的短语。