我试图在列行上查找重复项,但由于它们很模糊(值不同、拼写错误、缩进空间),我必须使用 pg_trgm 扩展和similarity() 函数来找到它们。问题是:即使我放置了所有可能的索引,这个查询也很长而且效率很低。
我的设置:PostgreSQL 11 pg_trgm 启用了表名:
id col_name fk_id
1 thing 2
2 thing 3
3 thing1 1
4 th1ng 4
此表中有近 10k 行,只是为了了解我正在处理的内容。
我创建了这个索引:
CREATE INDEX CONCURRENTLY index_nameof_streets_trgm
ON tablename
USING gin (col_name gin_trgm_ops);
并运行了这个查询(除了自连接,我没有找到任何其他方法来将列行与自身进行比较)
SELECT f1.col_name, f2.col_name, similarity(f1.col_name, f2.col_name)
FROM tablename f1
INNER JOIN
tablename f2 ON f1."Id" <> f2."Id"
WHERE similarity > 0.7
该死的,花了1200多秒还没有完成!(实际上,这并不是很意外,因为我在查询时得到了这个解释):
Nested Loop (cost=0.00..1748422.51 rows=99870042 width=4)
Join Filter: (f1."Id" <> f2."Id")
-> Seq Scan on "Streets" f1 (cost=0.00..260.94 rows=9994 width=37)
-> Materialize (cost=0.00..310.91 rows=9994 width=37)
-> Seq Scan on "Streets" f2 (cost=0.00..260.94 rows=9994 width=37)
我觉得我错过了一些简单且几乎愚蠢的东西,但我找不到确切的东西。任何有关如何在单列中查找模糊重复项的提示将不胜感激!谢谢 :)