【发布时间】:2019-10-18 19:45:45
【问题描述】:
我想从一个大约有 100 万行并且每小时都在增加的大表中删除重复项。它没有唯一的 id,大约有 575 列,但填充得很少。
该表“类似于”一个日志表,其中每小时添加新条目,没有唯一的时间戳。
重复项大约是 1-3%,但我还是想删除它;)有什么想法吗?
我尝试了 ctid 列(如here),但速度很慢。
【问题讨论】:
标签: postgresql duplicates
我想从一个大约有 100 万行并且每小时都在增加的大表中删除重复项。它没有唯一的 id,大约有 575 列,但填充得很少。
该表“类似于”一个日志表,其中每小时添加新条目,没有唯一的时间戳。
重复项大约是 1-3%,但我还是想删除它;)有什么想法吗?
我尝试了 ctid 列(如here),但速度很慢。
【问题讨论】:
标签: postgresql duplicates
与 PostgreSQL 一起工作的基本思想是在整个列集的哈希上创建一个索引。
例子:
CREATE INDEX index_name ON tablename (md5((tablename.*)::text));
这将起作用,除非有些列不能很好地满足不变性的要求(主要是 timestamp with time zone,因为它们的 cast-to-text 值取决于会话)。
创建此索引后,可以通过自连接哈希快速找到重复项,查询如下所示:
SELECT t1.ctid, t2.ctid
FROM tablename t1 JOIN tablename t2
ON (md5((t1.*)::text) = md5((t2.*)::text))
WHERE t1.ctid > t2.ctid;
您还可以使用此索引来避免将来重复行,而不是定期对它们进行重复数据删除,方法是将其设为 UNIQUE(重复行将在 INSERT 或 UPDATE 时被拒绝)。
【讨论】: