从大表中删除重复行 - PostgreSQL

时间:2014-05-12 15:55:34

标签: postgresql duplicates

我想从一个大表中删除重复项,这个表大约有一百万行并且每小时都在增加。它没有唯一的id,并且有大约575列但是稀疏地填充。

该表与“日志表”类似,每小时都会追加新条目而没有唯一的时间戳。

副本就像1-3%但是我想要删除它;)任何想法?

我尝试了ctid列(作为here),但速度非常慢。

1 个答案:

答案 0 :(得分:1)

与PostgreSQL一起使用的基本思想是在整个列集的哈希上创建一个索引。

示例:

CREATE INDEX index_name ON tablename (md5((tablename.*)::text));

除非有不符合不可变要求的列(主要是timestamp with time zone,因为它们的转换为文本值取决于会话),否则将被接受。

创建此索引后,可以通过使用哈希自加入来快速找到重复项,查询如下所示:

SELECT t1.ctid, t2.ctid
FROM tablename t1 JOIN tablename t2
 ON (md5((t1.*)::text) = md5((t2.*)::text))
WHERE t1.ctid > t2.ctid;

您也可以使用此索引来避免将来出现重复行,而不是定期对其进行重复数据删除。