PostgreSQL:根据匹配的 md5 哈希删除重复行

问题描述 投票:0回答:1

我有一个表,其中填充了从网络上抓取的数据。将新数据添加到表后,如果未对特定列进行任何更改,我想删除重复项。

我尝试了以下查询以及引用 md5 哈希的各种方法,并将 column1 转换为文本:

DELETE FROM
    my_table a
        USING my_table b
WHERE
    a.pk < b.pk
    AND a.md5(column1) = b.md5(column1);

并收到以下错误:

错误:列引用“column1”不明确第 6 行:AND a.md5(column1) = b.md5(column1); ^ SQL 状态:42702 字符:99

postgresql md5 postgresql-14 drop-duplicates
1个回答
0
投票

不要基于
md5()

进行重复数据删除

让 Postgres 弄清楚它是否从哈希中受益,如果是,最佳哈希函数应该是什么。您可以更轻松地声明,Postgres 更容易优化和执行,并且有可能避免不精确的结果 - md5 的出现只是为了简单起见,但长期以来它一直被认为是不可靠的。

如果 Postgres 发现值太长而无法与普通的

=
进行实际比较,它会在幕后将值相等性更改为值哈希相等性:

explain analyze verbose
DELETE FROM my_table a
USING my_table b
WHERE a.pk < b.pk
AND a.column1 = b.column1
returning *;
在public.my_table上删除a(成本= 3758.00..10978.49行= 7480宽度= 650)(实际时间= 26.669..68.048行= 1858循环= 1)
执行时间:68.541毫秒

注意带有

md5
的版本如何影响完全相同的行数,只是慢了 4 倍:demo

explain analyze verbose
DELETE FROM my_table a
USING my_table b
WHERE a.pk < b.pk
AND md5(a.column1) = md5(b.column1)
returning *;
在public.my_table上删除a(cost=18078.54..63328.54 rows=666667 width=650)(实际时间=215.633..249.269rows=1858loops=1)
执行时间:252.893 ms
© www.soinside.com 2019 - 2024. All rights reserved.