欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

PostgreSQL Oracle 兼容性之 - PL/SQL DETERMINISTIC 与PG函数稳定性(immutable, stable, volatile)...

程序员文章站 2022-07-13 10:11:39
...

标签

PostgreSQL , Oracle , 函数稳定性 , stable , immutable , volatile , DETERMINISTIC


背景

Oracle创建pl/sql函数时,有一个参数DETERMINISTIC,含义时只要输入的参数一样,返回的结果一定一样。

DETERMINISTIC Clause

Specify DETERMINISTIC to indicate that the function returns 

the same result value whenever it is called with the same values for its arguments.  
CREATE OR REPLACE FUNCTION text_length(a CLOB)   
   RETURN NUMBER DETERMINISTIC IS  
BEGIN   
  RETURN DBMS_LOB.GETLENGTH(a);  
END;  

在PostgreSQL中,称之为函数的稳定性参数

在PG中,函数稳定性分为三档:

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

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

volatile,不稳定。

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

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

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

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

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

等。

详细介绍见末尾文档。

参考

https://docs.oracle.com/cd/B19306_01/server.102/b14200/statements_5009.htm

http://www.dba-oracle.com/plsql/t_plsql_deterministic.htm

《PostgreSQL 函数稳定性与constraint_excluded分区表逻辑推理过滤的CASE》

《函数稳定性讲解 - retalk PostgreSQL function's [ volatile|stable|immutable ]》

《函数稳定性讲解 - 函数索引思考, pay attention to function index used in PostgreSQL》

《函数稳定性讲解 - Thinking PostgreSQL Function's Volatility Categories》