我想从一个大表中删除重复项,这个表大约有一百万行并且每小时都在增加。它没有唯一的id,并且有大约575列但是稀疏地填充。
该表与“日志表”类似,每小时都会追加新条目而没有唯一的时间戳。
副本就像1-3%但是我想要删除它;)任何想法?
我尝试了ctid列(作为here),但速度非常慢。
答案 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;
您也可以使用此索引来避免将来出现重复行,而不是定期对其进行重复数据删除。