使用pg_trgm

时间:2019-01-30 16:12:50

标签: postgresql duplicates self-join pg-trgm

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

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

0 个答案:

没有答案