迁移 Oracle 到 PostgreSQL: 确定性函数 DETERMINISTIC

五月 24, 2023

在 Oracle 中创建 PL/SQL 函数时,可以指定参数 DETERMINISTIC,该参数表示只要函数的输入参数值一样,返回的结果会保持不变。

Oracle 示例

DETERMINISTIC 子句:指定 DETERMINISTIC 以指示每当使用相同参数值调用函数时,该函数都会返回相同的结果值。

CREATE OR REPLACE FUNCTION text_length(a VARCHAR2)
   RETURN NUMBER DETERMINISTIC IS
BEGIN
  RETURN length(a);
END;

PostgreSQL 函数的稳定性

在 PostgreSQL 中,可以在使用 CREATE FUNCTION 语句创建函数对象时,指定函数的稳定性。函数稳定性分为三种:

  • immutable:任何时候都稳定。任何时候调用,只要函数的参数不变结果就不变。如果参数为常量或者无参数,在生成执行计划时,会直接将这类函数替换为常量。

  • stable:事务级别的稳定。在一个事务中调用时,只要函数的参数不变结果就不变。

  • volatile:易变的。

函数的稳定性会影响数据库的一些行为:

  1. 绑定变量,immutable函数(包含常量参数或不包含参数时)计算一次。stable函数每次bind的时候要重算。

  2. 生成执行计划,stable, immutable函数作为WHERE条件时,可以被用于索引AM。(即允许采用索引优化)

  3. 排除分区表不需要访问的分区,stable, immutable函数作为WHERE条件时,可用于过滤不需要访问的子表。

  4. 是否可用于创建索引,只有immutable函数或操作符,可以用于创建表达式索引。