Я пытался найти дубликаты в строках столбцов, но поскольку они нечеткие (не одно и то же значение, орфографические ошибки, пространство отступа), я должен использовать расширения pg_trgm и функцию Similarity (), чтобы найти их.Проблема в том, что этот запрос довольно длинный и неэффективный, даже если я размещаю все возможные индексы.
Моя настройка: PostgreSQL 11 pg_trgm включил имя таблицы:
id col_name fk_id
1 thing 2
2 thing 3
3 thing1 1
4 th1ng 4
В этой таблице почти 10 000 строк, просто для понимания того, с чем я имею дело.
Я создал этот индекс:
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)
Я чувствую, что упускаю что-то простое и почти глупое, но не могу найти, что именно.Будем благодарны за любые подсказки о том, как найти нечеткие дубликаты в одной колонке!Спасибо:)