VOLATILE
volatile
函数没有限制
,
可以修改数据
(
如执行
delete, insert , update).
使用同样的参数调用可能返回不同的值
.
volatile
函数不能被优化器选择作为优化条件
.(
例如减少调用
,
函数索引
,
索引扫描不允许使用
volatile
函数
)
在同一个查询中
,
同样参数的情况下可能被多次执行
(QUERY
有多行返回
/
扫描的情况下
).
snapshot
为函数内的每个
query
开始时的
snapshot.
因此对在函数执行过程中
,
外部已提交的数据可见
.(
仅仅限于调
用函数的事务隔离级别为
read committed)
STABLE
stable
和
immutable
函数
,
函数内不允许修改数据
.(
如
PGver>=8.0
函数内不可执行非
SELECT|PERFORM
语句
.)
使用同样的参数调用返回同样的结果
,
在事务中有这个特性的也归属
stable.
优化器可根据实际场景优化
stable
函数的调用次数
,
同样的参数多次调用可减少成单次调用
.
stable
和
immutable
函数可用于优化器选择合适的索引扫描
,
因为索引扫描仅评估被比较的表达式一次
,
后多次与索
引值进行比较
.
stable
和
volatile
函数都不能用于创建函数索引
,
只有
immutable
函数可以用于创建函数索引
.
stable
和
immutable
函数
, snapshot
为外部调用函数的
QUERY
的
snapshot,
函数内部始终保持这个
snapshot,
外部会
话带来的的数据变更不被反映到函数执行过程中
.
函数的三态小结
IMMUTABLE
不允许修改数据
,
使用同样的参数调用返回同样的结果
.
优化器在处理
immutable
函数时
,
先评估函数结果
,
将结果替换为常量
.
因此使用约束优化查询的场景中也只识别
immutable
函数
.
STABLE
和
IMMUTABLE
的区别
stable
函数在
select
和
where
子句中不被优化
,
仅仅当使用索引扫描时
where
子句对应的
stable
函数才会被优化为
1
次调
用
.
在
prepared statement
中的使用区别
:
immutable
函数在
plan
时以常量替代
, stable
函数在
execute
阶段被执行
.
因此
immutable
函数参数为常量时
,
在
prepared statement
场景只执行一次
,
而
stable
函数被多次执行
.