从大型表中删除重复行-PostgreSQL

从大型表中删除重复行-PostgreSQL,postgresql,duplicates,Postgresql,Duplicates,我想从一个大约有一百万行并且每小时增加的大表中删除重复项。它没有唯一的id,大约有575列,但填充稀疏 该表类似于日志表,每小时添加一个新条目,没有唯一的时间戳 重复项大约为1-3%,但我还是要删除它;)有什么想法吗 我尝试了ctid列(as),但速度非常慢。PostgreSQL的基本思想是在整个列集合的散列上创建一个索引 例如: CREATE INDEX index_name ON tablename (md5((tablename.*)::text)); 除非有一些列不能很好地满足不变性的

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

该表类似于日志表,每小时添加一个新条目,没有唯一的时间戳

重复项大约为1-3%,但我还是要删除它;)有什么想法吗


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

PostgreSQL的基本思想是在整个列集合的散列上创建一个索引

例如:

CREATE INDEX index_name ON tablename (md5((tablename.*)::text));
除非有一些列不能很好地满足不变性的要求(主要是
带时区的时间戳
,因为它们的转换为文本的值取决于会话),否则这将起作用

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

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

您也可以使用此索引来避免将来重复行,而不是通过使其唯一(重复行将在插入或更新时被拒绝)来定期消除重复行。

对我不起作用,因为我对TZ有时间戳,但我喜欢这种方法。我正尝试做类似的事情,但使用了时间戳TZ。但是,我知道数据库是UTC,时间戳也是UTC;我正在寻找一种解决不变性的方法。我想从数百万行中复制几千行,这样我可以重新创建主键…@Jeff:如果你有一个候选主键,那么你就不需要上面的方法了。在其上创建一个索引,然后使用可能会使用该索引的自联接消除重复项,然后删除该索引,然后设置唯一约束。感谢您的指导!我会尝试一些事情,否则我会在这里提出一个新问题,让你知道。