调用 volatile 函数时,函数可以是不可变的吗?

Che*_*zaz 5 postgresql functions

我有一个函数可以进行一些数学计算。它调用另一个易变的函数。我想知道调用函数是否可以声明为immutableor stable,或者它也必须声明为volatile

dez*_*zso 3

文档描述IMMUTABLE

IMMUTABLE 表示该函数不能修改数据库,并且在给定相同的参数值时始终返回相同的结果;也就是说,它不进行数据库查找或以其他方式使用未直接出现在其参数列表中的信息。[...]

这意味着您可以执行以下操作:

CREATE OR REPLACE FUNCTION immutablerandom() 
    RETURNS integer 
    LANGUAGE plpgsql 
    IMMUTABLE
AS $$
DECLARE a numeric;
BEGIN
    a := random();
    RETURN 1;
END;
$$;
Run Code Online (Sandbox Code Playgroud)

random()是一个易失性函数,并且immutablerandom()满足 的定义条件IMMUTABLE。如果这实际上有意义,那就是另一回事了——你必须完全放弃 易失性函数的结果,并且在实践中我看不到可以使用它的情况。

  • 我认为您在函数定义中声明的“VOLATILE / STABLE / IMMUTABLE”属性是为了告诉优化器是否可以应用某些优化。尝试使用 dezso 的定义 `a := 6 * random(); 返回 a;`,首先使用 `IMMUTABLE`,然后使用 `VOLATILE` 并运行 `select immutablerandom() from some_table limit 10 ;` 并比较结果。 (2认同)
  • 在一种情况下,您将获得相同的 10 个“随机”数字(因为函数调用将被优化为 1 次调用 - 您声明它是 IMMUTABLE!),在第二种情况下,您将获得真正的随机数,因为函数将被调用10倍。 (2认同)