postgresql postgres LIKE % operator vs similarity - pg_trgm.similarity_threshold .不同查询计划

h7appiyu  于 2023-06-29  发布在  PostgreSQL
关注(0)|答案(1)|浏览(150)

如果我用途:

SET pg_trgm.similarity_threshold = 0.9;
... where column % 'some string s';

PostgreSQL对以下对象执行索引扫描:gin(列gin_trgm_ops)
相反,这应该是相同的:

... where similarity(column, 'some string s' ) >= 0.9

它执行顺序扫描而不使用索引。
来自文档:https://www.postgresql.org/docs/11/pgtrgm.html
text % text布尔值
如果其参数的相似性大于pg_trgm.similarity_threshold设置的当前相似性阈值,则返回true。
为什么?

vsdwdz23

vsdwdz231#

基本上,WHERE条件必须如下所示,才能允许索引扫描:

<indexed expression> <operator> <constant>

在这里,<indexed expression>是您创建的索引,<operator>是索引操作符类的操作符家族支持的操作符,<constant>是在索引扫描期间保持不变的表达式(特别是,它只能包含STABLE函数)。
PostgreSQL中的一个例外是,如果您在WHERE条件中使用返回boolean的函数,并且该函数具有允许PostgreSQL替换索引扫描的优化器支持函数。但是similarity不是这样的函数。

相关问题