在 PostgreSQL 中,函数的易变性(Volatility)指的是函数在相同输入参数的情况下是否总是返回相同的结果。根据函数是否依赖于外部因素,可将函数的易变性分为三类:不可变函数(Immutable)、稳定函数(Stable)和易变函数(Volatile)。

1. 不可变函数(Immutable):
   - 不可变函数对于相同的输入参数始终返回相同的结果。
   - 不可变函数在查询执行期间不会读取或修改数据库的内容,也不受事务的影响。
   - 具有相同输入参数的不可变函数可以被数据库系统缓存并重用,从而提高性能。

   示例:
   CREATE OR REPLACE FUNCTION immutable_function(x INTEGER) RETURNS INTEGER AS $$
   BEGIN
     RETURN x * x;
   END;
   $$ LANGUAGE plpgsql IMMUTABLE;

2. 稳定函数(Stable):
   - 稳定函数对于相同的输入参数在同一事务中始终返回相同的结果,但在不同事务中的结果可能不同。
   - 稳定函数可以读取数据库的内容,但不会修改数据库。

   示例:
   CREATE OR REPLACE FUNCTION stable_function(x INTEGER) RETURNS INTEGER AS $$
   BEGIN
     RETURN x + CURRENT_DATE;
   END;
   $$ LANGUAGE plpgsql STABLE;

3. 易变函数(Volatile):
   - 易变函数对于相同的输入参数在同一事务或查询中可能返回不同的结果。
   - 易变函数可能读取或修改数据库的内容,也可能依赖于事务状态或其他外部因素。

   示例:
   CREATE OR REPLACE FUNCTION volatile_function(x INTEGER) RETURNS INTEGER AS $$
   BEGIN
     RETURN x + random();
   END;
   $$ LANGUAGE plpgsql VOLATILE;

在创建函数时,可以使用 IMMUTABLE、STABLE 或 VOLATILE 关键字来明确指定函数的易变性。这有助于优化查询计划,并确保在不同上下文中正确使用函数。默认情况下,如果不指定易变性,函数将被认为是易变的。


转载请注明出处:http://www.zyzy.cn/article/detail/8470/PostgreSQL