PG 函数稳定性
PostgreSQL的函数稳定性分为三种:
-
immutable:超级稳定。任何时候调用,只要函数的参数不变结果就不变。
如果参数为常量或者无参数,在生成执行计划时,直接将这类函数替换为常量。
-
stable:稳定。
在一个事务中调用时,只要函数的参数不变结果就不变。同样的参数值stable 函数多次执行返回的结果应该一致。
-
volatile:不稳定。
指函数可以修改数据库(比如update),函数参数值相同的情况下,可以返回不同的 结果,所以volatile函数在执行过程中优化器对它的处理是每一行都需要执行一次volatile函 数。
例子:
# 查看函数稳定性
postgres=# select proname, provolatile from pg_proc where proname in ('now', 'clock_timestamp');
proname | provolatile
-----------------+-------------
now | s
clock_timestamp | v
(2 rows)
## clock_timestamp 是 voatile, now 是 stable
# 测试数据
create table test_func (id int, time1 timestamp, time2 timestamp) ;
insert into test_func select generate_series(1,5),clock_timestamp(),now() ;
## 插入语句,对于 stable 函数 now() 应该只执行一次
postgres=# select * from test_func ;
id | time1 | time2
----+----------------------------+----------------------------
1 | 2022-08-19 19:02:32.74568 | 2022-08-19 19:02:32.742638
2 | 2022-08-19 19:02:32.745797 | 2022-08-19 19:02:32.742638
3 | 2022-08-19 19:02:32.745799 | 2022-08-19 19:02:32.742638
4 | 2022-08-19 19:02:32.7458 | 2022-08-19 19:02:32.742638
5 | 2022-08-19 19:02:32.7458 | 2022-08-19 19:02:32.742638
(5 rows)
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




