在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