标签
PostgreSQL , Oracle , 函数稳定性 , stable , immutable , volatile , DETERMINISTIC
https://github.com/digoal/blog/blob/master/201804/20180410_01.md#%E8%83%8C%E6%99%AF 背景
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;
https://github.com/digoal/blog/blob/master/201804/20180410_01.md#%E5%9C%A8postgresql%E4%B8%AD%E7%A7%B0%E4%B9%8B%E4%B8%BA%E5%87%BD%E6%95%B0%E7%9A%84%E7%A8%B3%E5%AE%9A%E6%80%A7%E5%8F%82%E6%95%B0 在PostgreSQL中,称之为函数的稳定性参数
在PG中,函数稳定性分为三档:
immutable,超级稳定,任何时候调用,只要函数的参数不变结果就不变。如果参数为常量或者无参数,在生成执行计划时,直接将这类函数替换为常量。
stable,稳定,在一个事务中调用时,只要函数的参数不变结果就不变。
volatile,不稳定。
函数的稳定性会影响数据库的一些行为:
1、绑定变量,immutable函数(包含常量参数或不包含参数时)计算一次。stable函数每次bind的时候要重算。
2、生成执行计划,stable, immutable函数作为WHERE条件时,可以被用于索引AM。(即允许采用索引优化)
3、排除分区表不需要访问的分区,stable, immutable函数作为WHERE条件时,可用于过滤不需要访问的子表。
4、是否可用于创建索引,只有immutable函数或操作符,可以用于创建表达式索引。
等。
详细介绍见末尾文档。