在postgresql中,函数有个不稳定性分类属性,它会影响优化器评估函数的可优化级别、同时也会影响postgresql中​​并行执行​​的可行性。

  函数有三种类型:​​VOLATILE、STABLE以及​​IMMUTABLE。VOLATILE是函数默认类别,也就是优化器假设函数会修改数据库,不会做任何特定的优化。STABLE可用于基于函数的索引扫描。IMMUTABLE通常用于静态常量的优化。对于一些短小逻辑的函数,典型的是数据字典翻译,但是写在SQL中会导致很复杂的逻辑,应该在创建函数时声明为STABLE。一般来说IMMUTABLE不是特别必要。​

CREATE FUNCTION dup(in int, out f1 int, out f2 text)
AS $$ SELECT $1, CAST($1 AS text) || ' is text' $$
LANGUAGE sql IMMUTABLE ;

explain analyze SELECT dup(42) from (select 1 from pg_catalog.generate_series(1, 1000000));

​https://www.postgresql.org/docs/13/xfunc-volatility.html​

​https://www.postgresql.org/docs/current/sql-createfunction.html​​ 

​https://www.postgresql.org/docs/13/xfunc-pl.html​