我有一个表,其中填充了从网络上抓取的数据。将新数据添加到表后,如果未对特定列进行任何更改,我想删除重复项。
我尝试了以下查询以及引用 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
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 |