这是我在处理各种不同数据集的工作中经常出现的问题,所以请原谅我笼统地介绍它,而不是使用具体的例子。
我经常需要从一个大表(通常为数百万行)中获取记录,其中一个文本列类似于一个小得多的表(10 到 100 行)中的列。我目前的做法如下,targets
小表在哪里matches
,大表在哪里。
set pg_trgm.similarity_threshold = .9;
select *
from targets as t
inner join matches as m on
t.name % m.name;
matches.name
将具有 GIN 索引,并且通常具有相对较高的唯一性,可能有 10-20% 的记录是重复的。两者matches.name
和targets.name
几乎总是少于 50 个字符,而且通常短得多。
据我了解,这是一个稍微不寻常的用例:Postgres 文档和大多数 SO 答案似乎都集中在优化以匹配单个值。所以我很想听听关于两个问题的想法:
- 笼统地说(几十分钟、几小时等),并假设数据库配置得最优化,就性能而言,这种类型的查询的合理目标是什么,例如,给定 300 个目标和 3 亿个潜在匹配项?
- 在给定参数的情况下,我目前使用的策略是最有效的策略吗?例如,是否值得尝试使用 GiST 索引并使用运算符获取每行的前n 个匹配项
<->
?是否有完全不同的方法可以更有效?
在此先感谢您的帮助!