暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

【每日分享】2022.08.19 函数稳定性

原创 Maleah 2022-08-19
731

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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

文章被以下合辑收录

评论