抖一抖原来函数还有稳不稳定的说法函数的稳定性构造测试环境在事务里调用同一条SQL里调用WHERE后调用函数的稳定性函数稳定性参数的三种状态IMMUTABLE函数在plan时执行且只执行一次。在 select 后面调用序列只会生成多个相同的值在 where 后面调用序列只会生成多个相同的值STABLE函数在execute时执行。在 select 后面调用序列会生成多个不同的值在 where 后面调用序列只会生成多个相同的值VOLATILE函数在execute时执行。在 select 后面调用序列会生成多个不同的值在 where 后面调用序列会生成多个不同的值。默认值函数稳定性参数执行时刻SELECT后调用序列WHERE后调用IMMUTABLEPLAN生成多个相同的值生成多个相同的值STABLEEXECUTE生成多个不同的值生成多个相同的值VOLATILEEXECUTE生成多个不同的值生成多个不同的值默认值稳定性immutable stable volatile⚠️注意序列无法回滚下面分别演示在事务里、在同一条SQL里和在where后调用这3种状态的不同表现构造测试环境-- 查看nextval的函数定义10:10:42pg14testdb# \sf nextvalCREATEORREPLACEFUNCTIONpg_catalog.nextval(regclass)RETURNSbigintLANGUAGEinternal STRICTAS$function$nextval_oid$function$-- 创建自定义测试函数test_nextvalCREATEORREPLACEFUNCTIONtest_nextval(regclass)RETURNSbigintLANGUAGEinternal STRICTAS$function$nextval_oid$function$;-- 创建测试序列createsequence test_sequence;在事务里调用行为一致没有差别alterfunctiontest_nextval(regclass)immutable;-- 事务里调用begin;selecttest_nextval(test_sequence),test_nextval(test_sequence);rollback;alterfunctiontest_nextval(regclass)stable;alterfunctiontest_nextval(regclass)volatile;同一条SQL里调用指定immutable的函数执行计划的计划器在解析sql并执行的时不管有多少条记录只会执行一次alterfunctiontest_nextval(regclass)immutable;-- 同一条SQL里调用selecttest_nextval(test_sequence::regclass)fromgenerate_series(1,3);alterfunctiontest_nextval(regclass)stable;alterfunctiontest_nextval(regclass)volatile;WHERE后调用放在 WHERE 后调用指定immutable或stable的函数只执行一次默认的volatile会执行多次selectcurrval(test_sequence);alterfunctiontest_nextval(regclass)immutable;-- where后调用select*from(selectgenerate_series(1,5))astempwheretest_nextval(test_sequence)17;alterfunctiontest_nextval(regclass)stable;alterfunctiontest_nextval(regclass)volatile;发现了一个前沿巨牛的宝藏人工智能学习网站通俗易懂风趣幽默忍不住给大家分享一下。戳一下跳转到学习。
函数的稳定性表现差异 IMMUTABLE | STABLE | VOLATILE
发布时间:2026/6/10 10:04:33
抖一抖原来函数还有稳不稳定的说法函数的稳定性构造测试环境在事务里调用同一条SQL里调用WHERE后调用函数的稳定性函数稳定性参数的三种状态IMMUTABLE函数在plan时执行且只执行一次。在 select 后面调用序列只会生成多个相同的值在 where 后面调用序列只会生成多个相同的值STABLE函数在execute时执行。在 select 后面调用序列会生成多个不同的值在 where 后面调用序列只会生成多个相同的值VOLATILE函数在execute时执行。在 select 后面调用序列会生成多个不同的值在 where 后面调用序列会生成多个不同的值。默认值函数稳定性参数执行时刻SELECT后调用序列WHERE后调用IMMUTABLEPLAN生成多个相同的值生成多个相同的值STABLEEXECUTE生成多个不同的值生成多个相同的值VOLATILEEXECUTE生成多个不同的值生成多个不同的值默认值稳定性immutable stable volatile⚠️注意序列无法回滚下面分别演示在事务里、在同一条SQL里和在where后调用这3种状态的不同表现构造测试环境-- 查看nextval的函数定义10:10:42pg14testdb# \sf nextvalCREATEORREPLACEFUNCTIONpg_catalog.nextval(regclass)RETURNSbigintLANGUAGEinternal STRICTAS$function$nextval_oid$function$-- 创建自定义测试函数test_nextvalCREATEORREPLACEFUNCTIONtest_nextval(regclass)RETURNSbigintLANGUAGEinternal STRICTAS$function$nextval_oid$function$;-- 创建测试序列createsequence test_sequence;在事务里调用行为一致没有差别alterfunctiontest_nextval(regclass)immutable;-- 事务里调用begin;selecttest_nextval(test_sequence),test_nextval(test_sequence);rollback;alterfunctiontest_nextval(regclass)stable;alterfunctiontest_nextval(regclass)volatile;同一条SQL里调用指定immutable的函数执行计划的计划器在解析sql并执行的时不管有多少条记录只会执行一次alterfunctiontest_nextval(regclass)immutable;-- 同一条SQL里调用selecttest_nextval(test_sequence::regclass)fromgenerate_series(1,3);alterfunctiontest_nextval(regclass)stable;alterfunctiontest_nextval(regclass)volatile;WHERE后调用放在 WHERE 后调用指定immutable或stable的函数只执行一次默认的volatile会执行多次selectcurrval(test_sequence);alterfunctiontest_nextval(regclass)immutable;-- where后调用select*from(selectgenerate_series(1,5))astempwheretest_nextval(test_sequence)17;alterfunctiontest_nextval(regclass)stable;alterfunctiontest_nextval(regclass)volatile;发现了一个前沿巨牛的宝藏人工智能学习网站通俗易懂风趣幽默忍不住给大家分享一下。戳一下跳转到学习。