我试图在列行上查找重复项,但是由于它们是模糊的(值,拼写错误,缩进空间不同),我必须使用pg_trgm扩展名和相似性()函数来查找重复项。问题是:即使我放置了所有可能的索引,此查询也相当长且效率低下。
我的设置: PostgreSQL 11 pg_trgm已启用 表名:
id col_name fk_id
1 thing 2
2 thing 3
3 thing1 1
4 th1ng 4
此表中几乎有1万行,只是为了了解我要处理的内容。
我创建了该索引:
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)
我觉得我缺少了一些简单而愚蠢的东西,但是我找不到确切的东西。关于如何在单列中查找模糊重复项的任何提示将不胜感激!谢谢:)