2

我试图在列行上查找重复项,但由于它们很模糊(值不同、拼写错误、缩进空间),我必须使用 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)

我觉得我错过了一些简单且几乎愚蠢的东西,但我找不到确切的东西。任何有关如何在单列中查找模糊重复项的提示将不胜感激!谢谢 :)

4

0 回答 0