Postgre SQL   发布时间:2022-05-20  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了PostgreSQL 函数稳定性状态大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
POSTGResql 函数在定义的时候有三个稳定性状态可选:
IMMUtable | Stable | VolATILE
分别代表,非常稳定,稳定,不稳定。

不稳定,函数可以修改数据库的数据,输入同样的参数可以返回不同的结果,同一个QUERY中,如果需要返回该函数的结果,那么每一行都会运算一遍这个函数(后面会有例子)。
稳定,函数不可以修改数据库的数据,同一个QUERY中,如果需要返回该函数的结果,那么将合并多次运算为一次这个函数(后面会有例子)。另外,只有stable和immutable的函数才可以被执行计划选择作为索引的比较条件。(因为索引比较时,被比较的值只运算一次.这个就需要stable和immutable了)
非常稳定,函数不可以修改数据库的数据,并且在任何情况下调用,只要输入参数一致,返回结果都一致。
在创建函数时,必须严格的定义稳定性状态,否则可能导致意想不到的后果,因为PLAN CACHE以及prepared statement等原因.
函数索引必须是immutable的 .
注意稳定和非常稳定的函数中只能出现SELECT语句。但是SELECT语句中可以调用不稳定函数,因此这些稳定性选项都不是强限制。
另外稳定性选项还影响了对数据的可视特性,如 StableandIMMUtablefunctions use a snapshot established as of the start of the calling query,whereasVolATILEfunctions obtain a fresh snapshot at the start of each query they execute.

实例:
下面来用几个时间函数来测试一下:

proname | provolatile pronargs
----------------------------------------+-------------+----------
timeNow s 0
timeofday v Now transaction_timestamp statement_timestamp clock_timestamp 0


其中
clock_timestamp是voatile的.Now是stable的。

digoal => create table tbl_time ( ID int , row_time timestamp without time zone stat_time timestamp without time zone );
CREATE table
digoal insert into tbl_time SELEct generate_serIEs ( 1 :rgb(102, 10000 ),0)">clock_timestamp (),0)">Now ();
INSERT 0 10000
digoal=> SELEct count(*),count(disTinct row_timedisTinct stat_time)from tbl_time;
count
count count
-------+-------+-------
10000 1
(1 row)


# 情况已经很明朗了
volatile每一行都运算了,stable的只是STATEMANT开始是运算。
# 再来看看索引的比较

digoal=> explain SELEct * from tbl_time where row_time>Now();
query PLAN
------------------------------------------------------------------------------
Index Scanusing IDx_row_time on tbl_time (cost=0.00..4.27 rows@H_618_340@1 wIDth@H_618_340@20)
Cond:row_time Now())
(2
clock_timestamp query PLAN
--------------------------------------------------------------
Seq on tbl_time @H_618_340@214.003333Filter clock_timestamp)

# 很明显,volatile的函数在WHERE条件中,不走索引。而Now()即stable的函数,使用了索引。

# 把clock_timestamp改成stable试试。马上就走索引了。不过这个不能乱改.

\c digoal POSTGRes
You are Now connected to database "digoal"as user "POSTGRes".
=# alter function clock_timestamp() Strict stable;
ALTER FUNCTION
digoal=# \c digoal digoal
You are Now connected to database "digoal" as user "digoal".
digoal=> explain SELEct * FROM tbl_time where row_time>clock_timestamp();
query PLAN
------------------------------------------------------------------------------
Index Scan using IDx_row_time on tbl_time (cost=0.00..4.27 rows=1 wIDth=20)
Index Cond: (row_time > clock_timestamp())
(2 rows)

# 那么看看插入会不会受到影响
truncate table tbl_time;
TruncATE table
digoal insert into tbl_time generate_serIEs1:rgb(102,10000clock_timestampNow();
INSERT 010000
count
-------+-------+-------
1
)

# 看来插入的时候还是每一个ROW运行一次。

所以三个状态都是定义层面的,不是完全的执行层面的。
本图文内容来源于网友网络收集整理提供,作为学习参使用,版权属于原作者。
@H_673_613@

Postgre SQL相关文章

@H_472_618@ @H_673_613@死锁检测与解决
死锁的成因与解决方式
@H_472_618@ @H_673_613@数据库中的表达式
数据库中的表达式
@H_472_618@ @H_673_613@PolarDB POSTGReSQL 架构原理解读
背景 PolarDB POSTGReSQL(以下简称PolarDB)是一款阿里云自主研发的企业级数据库产品,采用计算存储分离架构,兼容POSTGReSQL与Oracle。PolarDB 的存储与计算能
@H_472_618@ @H_673_613@PolarDB POSTGReSQL logindex 设计
背景介绍 PolarDB采用了共享存储一写多读架构,读写节点RW和多个只读节点RO共享同一份存储,读写节点可以读写共享存储中的数据;只读节点仅能各自通过回放日志,从共享存储中读取数据,而不能写入,只读
@H_472_618@ @H_673_613@PolarDB POSTGReSQL 快速入门
什么是PolarDB POSTGReSQL PolarDB POSTGReSQL(下文简称为PolarDB)是一款阿里云自主研发的云原生数据库产品,100%兼容PostgreSQL采用基于Share
@H_472_618@ @H_673_613@POSTGReSQL 9.4文档 第4章 sql语
本章介绍SQL的语法。它是理解后面章节的基础,它们详细描述了SQL如何用于定义和修改数据。对于已经熟悉SQL的用户,同样应该仔细阅读本章,因为它包含了各个SQL数据库中实现方式不同的一些规则和概念,这些是POSTGReSQL特有的属性。4.1. 词法结构SQL输入由一系列命令组成。命令由一系列符号组成,以分号(“;”)结束。输入流的结束也会结束一个命令。每个命令能够使用的符号不尽相同。
@H_472_618@ @H_673_613@POSTGReSQL 9.4文档 第5章 数据定义
本章讲述如何创建用于存储数据的数据库结构。在关系数据库中,原始数据存储在表中,因此本章主要涉及如何创建修改表,以及控制表中存储的数据的特性。然后,我们讨论了如何在模式中组织表,以及表的权限管理。最后,我们将简单了解与数据存储有关的其他特性,例如继承,视图,函数和触发器。5.1. 表的基础知识 关系数据库中的表就像书面上的表格一样:由行和列组成。列的数量和顺序是固定的,并且每个列有一个...
@H_472_618@ @H_673_613@POSTGReSQL 9.4文档 第6章 数据操作
上一章讨论了如何创建存储数据的表和其他结构。接下来就需要往表中填充数据。本章设计如何插入,更新,以及删除表中的数据。下一章将最后说明如何从数据库中查询久违的数据。6.1. 插入数据 表刚被创建时,没有任何数据。数据库能够使用之前的第一件事就是插入数据。从概念上讲,每次插入一行数据。当然你也可以插入多行数据,但是无法插入少于一行的数据。即使你只知道某些字段值,也必须创建一个完整的行。I...
@H_450_696@
@H_450_696@
@H_643_714@mySQLMsSQLOraclesqlitePostgre SQLR_53_11845@ariadbMongoDBNoSQLHBaseJDBCmycat
@H_450_696@
  • • 死锁检测与解决
  • • 数据库中的表达式
  • • PolarDB POSTGReSQL Buffer Ma
  • • PolarDB POSTGReSQL 架构原理解
  • • PolarDB POSTGReSQL logindex
  • • PolarDB POSTGReSQL DDL同步原
  • • PolarDB POSTGReSQL 快速入门
  • POSTGReSQL 9.4文档 第4章 SQL
  • POSTGReSQL 9.4文档 第3章 高级
  • POSTGReSQL 9.4文档 第5章 数据
  • POSTGReSQL 9.4文档 第6章 数据
  • POSTGReSQL 9.4文档 第2章 SQL
@H_450_696@
@H_450_696@

PostgreSQL 函数稳定性状态

微信公众号搜 "程序精选"关注
@H_450_696@
@H_450_696@
  • • 死锁检测与解决
  • • 数据库中的表达式
  • • PolarDB POSTGReSQL Buffer Ma
  • • PolarDB POSTGReSQL 架构原理解
  • • PolarDB POSTGReSQL logindex
  • • PolarDB POSTGReSQL DDL同步原
  • • PolarDB POSTGReSQL 快速入门
  • POSTGReSQL 9.4文档 第4章 SQL
  • POSTGReSQL 9.4文档 第3章 高级
  • POSTGReSQL 9.4文档 第5章 数据
@H_450_696@
python-3.xpandasswiftarraysspring-boosql-serverrubydataframeamazon-webfirebasegoazurealgorithmdelphiVBAregexasp.net-coPowerSHellelasticsearuby-on-raspring-mvcmultithrealoopsgoogle-clovisual-stutomcatperfoRMANcapache-spaasp.net-mvgoogle-cloTSQLunity3d.net-corefor-loopvb.netmavenmachine-leauthenticascalaherokudjango-modpysparklinqif-statemeobjective-dplyrasynchronosshwinformssecurityjpaentity-frauser-intergraphqlfirebase-roptimizatidebuggingdjango-vievariablesgoogle-bigmatlabxamarinparsingamazon-ec2recursionnetworkingentity-fraintellij-iimage-proccmakesql-serverIntegerfirebase-asqlalchemydata-strucautomationindexingspring-datplsqlnlp

大佬总结

以上是大佬教程为你收集整理的PostgreSQL 函数稳定性状态全部内容,希望文章能够帮你解决PostgreSQL 函数稳定性状态所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签:稳定非常稳定
猜你在找的Postgre SQL相关文章
其他相关热搜词更多
phpJavaPython程序员load如何string使用参数jquery开发安装listlinuxiosandroid工具javascriptcap