使用自定义函数后未使用postgreSql索引

14ifxucb  于 2023-03-22  发布在  PostgreSQL
关注(0)|答案(1)|浏览(171)

我定义了一个自定义函数

CREATE OR REPLACE FUNCTION "public"."div_zeroTest"("a" numeric, "b" numeric)
  RETURNS "pg_catalog"."numeric" AS $BODY$
    SELECT CASE b
    WHEN 0 THEN
        0
    ELSE
        a/b
END;
$BODY$
  LANGUAGE sql VOLATILE
  COST 100

但是当我使用他时,我发现使用这个函数会使索引enter image description here无效
如果我直接使用casewhen,它仍然会生效enter image description here
为什么会导致这种情况

7rtdyuoh

7rtdyuoh1#

没有足够的细节来确定,但作为一般规则,为了使使用函数的查询使用索引,您需要创建expression index并在where子句中使用与索引定义相同的表达式。
此外,函数必须标记为immutable而不是volatile,因为您的函数显然是纯函数(相同的输入总是会产生相同的输出)。

相关问题