news 2026/6/10 10:04:24

函数的稳定性表现差异 IMMUTABLE | STABLE | VOLATILE

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
函数的稳定性表现差异 IMMUTABLE | STABLE | VOLATILE

抖一抖!原来函数还有稳不稳定的说法

    • 函数的稳定性
      • 构造测试环境
      • 在事务里调用
      • 同一条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:42pg14@testdb=# \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 后调用,指定immutablestable的函数只执行一次,默认的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;


发现了一个前沿巨牛的宝藏人工智能学习网站,通俗易懂,风趣幽默,忍不住给大家分享一下。戳一下跳转到学习。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/10 9:56:55

【Python 注释文档字符串(Docstring)】

文章目录Python 注释文档字符串(Docstring)什么是Docstring?为什么Docstring很重要?Docstring的格式规范多行Docstring的编写技巧使用mermaid可视化函数关系在类中使用Docstring模块和包的Docstring自动化文档生成Docstring的测试…

作者头像 李华
网站建设 2026/6/10 9:53:51

京东商品详情页采集API、淘宝1688API

采集场景「技术、数据、接口、系统问题可留言私信沟通」 打开京东商品详情页(实例ID:xxx.xx/10174191277638 ),采集点击不同的参数(颜色、版本等)后得到的数据(商品编号、价格、主图链接等字段会…

作者头像 李华
网站建设 2026/6/10 9:49:45

项目实训个人博客:AI调用设计

前言前边写了很多和AI相关模块的设计,可能会有些糊涂这个软件里AI到底是怎么调用的,这边博客用来详细阐述AI的具体调用实现,也算是我自己的一个相关总结和反思。一、AI Orchestrator这是AI能力编排服务,协调整个AI能力调用流程&am…

作者头像 李华
网站建设 2026/6/10 9:47:28

【从搬运工到协处理器:网卡芯片架构、算法、验证与边缘演进深度剖析】

从搬运工到协处理器:网卡芯片架构、算法、验证与边缘演进深度剖析现代数据中心里,网卡早已不是那个“把数据搬进主机”的哑设备。它正在成为计算体系的真正节点——懂协议、会调度、能卸载,甚至在边缘侧开始接管实时控制。本文将用一篇万字长…

作者头像 李华
网站建设 2026/6/10 9:46:26

23种设计模式精讲:从入门到精通,一文掌握设计模式核心思想

面试中经常被问到设计模式?项目中不知道如何应用设计模式优化代码?面对复杂系统设计感到无从下手?本文全面讲解23种GoF设计模式,包括6大设计原则、5种创建型模式、7种结构型模式、11种行为型模式,结合UML类图、源码解析…

作者头像 李华