【MogDB/openGauss的三种函数稳定性关键字】

一、ORACLE中的类似的函数稳定性关键字(DETERMINISTIC)

在ORACLE里,function有着一个DETERMINISTIC参数,它表示一个函数在输入不变的情况下输出是否确定,只要输入的参数一样,返回的结果一定一样的,以保证函数对于任何输入总是完全相同的方式处理参数,oracle的内置函数 UPPER,TRUNC 等都是 deterministic 函数。具体例子如下:

----带DETERMINISTIC的现象
create or replace function f_t(i_p int) return number DETERMINISTIC isi_rtn number;begini_rtn := i_p * dbms_random.value(1,10);return i_rtn;end;/select LEVEL,f_t(1) FROM DUAL CONNECT BY LEVEL<=10;----不带DETERMINISTIC的现象create or replace function f_t(i_p int) return number isi_rtn number;begini_rtn := i_p * dbms_random.value(1,10);return i_rtn;end;/select LEVEL,f_t(1) FROM DUAL CONNECT BY LEVEL<=10;

image.png

可以看到,带了DETERMINISTIC参数的,多次执行的结果都是一样的,能保证函数的稳定性。

二、MogDB/openGauss的三种函数稳定性状态

而MogDB数据库的函数虽然没有DETERMINISTIC关键字,但是函数也有着类似的三种状态的关键字,分别是immutable、stable和volatile。合理使用着三种不同的状态可以显著改善函数性能。
在数据库里使用\d create function也可以看到这三种状态的关键字提示。

image.png

IMMUTABLE(非常稳定)

任何时候调用,只要函数的参数不变结果就不变。 纯函数,执行结果可能会在规划时被预求值并缓存。
允许优化器在一个查询用常量参数调用该函数时提前计算该函数,整数加法操作符底层的函数被 标记为IMMUTABLE。

表示该函数不能修改数据库并且对于给定的参数值总是会返回相同的值。 也就是说,它不会做数据库查找或者使用没有在其参数列表中直接出现的信息。immutable, 和stable非常类似, 但是immutable是指在任何情况下, 只要参数一致, 结果就一致。

STABLE(稳定)

稳定,在一个事务中调用时,只要函数的参数不变结果就不变。
STABLE函数不能修改数据库状态,但是对于相同的参数值,它在一次表扫描中将返回相同的结果。
因而优化器可以将相同参数的多次调用优化成一次调用。在索引扫描条件中允许使用STABLE函数。

在大多数情况下是的。在单个表扫描中,对相同的参数值返回相同的结果,但结果将通过SQL语句进行更改。 结果取决于数据库查找或参数值。 current_timestamp系列函数是 STABLE; 值在执行中不会改变。

immutable和stable很像,显著的区别是优化器对immutable和stable函数的处理上,immutable函数在优化器生成执行计划时会将函数结果替换函数. 也就是函数不在输出的执行计划中, 取而代之的是一个结果常量。stable函数则不会如此, 执行计划输出后还是函数。

immutable和stable在调用次数上的明显区别可以用如下的测试验证出来:

CREATE OR REPLACE FUNCTION func_out_num() RETURNS INTEGER AS
$$
BEGIN
RAISE NOTICE 'Invoke the func.';
RETURN 6;
END;
$$ LANGUAGE PLPGSQL STABLE;select func_out_num() from generate_series(1,10);
alter function func_out_num() immutable;
select func_out_num() from generate_series(1,10);

image.png

在本例中,当使用STABLE关键字的时候,会按照调用10次函数,而当使用IMMUTABLE关键字时,它会被优化为一次调用。

除此之外,把函数内容放到结果集部分,两种状态的差异也很大,如下测试可以看出:

MogDB=# create table test_stable (id int, info text);  
CREATE TABLE
MogDB=# insert into test_stable select generate_series(1,100000),random()::text;  
INSERT 0 1000
MogDB=# create index idx_test_a on test(id);  
CREATE INDEX

创建如下函数

create or replace function func_stable() returns numeric as $$  
declare  
begin  return 2;  
end;  
$$ language plpgsql stable; 

image.png

使用如下语句可以进行验证两种方式的执行计划时间明显不同。

explain analyze select func_stable() from test_stable; 

image.png


因此,在事务中参数一致则结果一致,且只关注函数的最终结果可以标记为immutable,因为它调用函数的次数少,固化了函数的结果,执行计划的代价较小。但是一般还是建议使用stable,因为它会老老实实的去执行函数,而不是只取一个固化的结果。

VOLATILE(不稳定)

默认为VOLATILE。表示该函数的值在一次表扫描中都有可能改变,因此不能做优化。

VOLATILE函数可以做任何事情,包括修改数据库状态。 在连续调用时即使使用相同的参数,也可能会返回不同的结果。优化器不会优化掉此类函数,每次调用都会重新求值。
在这种意义上,相对较少的数据库函数是不稳定的。 例如: random(), currval(), timeofday()。 任何具有副作用的函数的都不稳定的,即使其结果是可预测的。例如: setval()。

只有函数声明了VOLATILE状态才可以进行update操作。

具体的验证如下所示:

MogDB=# create table test_volatile (id int, info text);  
CREATE TABLE
MogDB=# insert into test_volatile select generate_series(1,1000),random()::text;  
INSERT 0 1000
MogDB=# create index idx_test on test(id);  
CREATE INDEX

然后建立测试的函数

create or replace function func_volatile(ida int) returns text as $$  
declare  result text;  
begin   update test_volatile set info='xiaoguaishou' where id=ida returning info into result;  return result;  
end;
$$ language plpgsql volatile;  

可以看到测试结果:

image.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/133354.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

3.网络之UDP

UDP协议 文章目录 UDP协议1. UDP概述2. UDP报文格式3. UDP传输限制4. UDP校验和4.1 CRC 循环冗余校验算法4.2 md5 校验算法 1. UDP概述 UDP&#xff08;UserDatagramProtocol&#xff09;是一个简单的面向消息的传输层协议&#xff0c;尽管UDP提供标头和有效负载的完整性验证&a…

Qt 各种数据类型

目录 1. 基础类型 2. log 输出 3. 字符串类型 3.2 QByteArray 构造函数 数据操作 子字符串查找和判断 遍历 查看字节数 类型转换 3.3 QString 4. QVariant 4.1 标准类型 4.2 自定义类型 5. 位置和尺寸 5.1 QPoint 5.2 QLine 5.3 QSize 5.4 QRect 6. 日期和…

【源码解析】聊聊SpringBean是如何初始化和创建

我们知道通过类进行修复不同的属性&#xff0c;比如单例、原型等&#xff0c;而具体的流程是怎么样的呢&#xff0c;这一篇我们开始从源码的视角分析以下。 刷新方法 在刷新容器中有一个方法&#xff0c;其实就是 Bean创建的过程。 finishBeanFactoryInitialization(beanFact…

【Java 进阶篇】JSP 指令详解

JavaServer Pages&#xff08;JSP&#xff09;是一种用于开发动态 Web 应用程序的强大技术。与传统的 Servlet 编程相比&#xff0c;JSP 更易于编写和维护。在 JSP 中&#xff0c;我们可以使用指令来定义页面的行为和属性。本博客将深入探讨 JSP 中的指令&#xff0c;从入门到精…

macOS 下 starUML 软件激活方案

starUML每次打开都弹出提示其实挺烦的&#xff0c;于是研究了一下如何 po 解(激活)它。记录一下方法以便以后使用。 我觉得这个软件很好用&#xff0c;大型项目的所有图我都是用这个软件画的。 直接上步骤&#xff01;先关掉starUML 1、安装 asar&#xff0c;以便可以打开 asa…

助力生成式AI人才培养,飞桨(湖北)教育创新中心启动建设

10月21日下午&#xff0c;由湖北省自动化学会主办&#xff0c;百度飞桨联合华中科技大学共同承办的湖北省高校产教融合院长研讨会在武汉华科大希尔顿欢朋酒店成功召开。来自湖北省内十二所高校人工智能、计算机、自动化相关学院的18位二级学院院长、副院长以及来自飞桨的代表共…

项目流程管理工具 OmniPlan Pro 4 mac中文版软件介绍

OmniPlan Pro mac是 The Omni Group 为 macOS 和 iOS 操作系统开发的项目管理软件。它允许用户创建和管理复杂的项目、定义任务、分配资源、跟踪进度和生成报告。 OmniPlan Pro mac包括甘特图、网络图、关键路径分析、资源均衡和成本跟踪等功能。 借助 OmniPlan Pro&#xff0…

【PTE-day03 报错注入】

报错注入 1、报错注入 group by count2、报错注入 extractvalue3、报错注入updatexml1、报错注入 group by count http://124.222.124.9:8888/Less-5/?id=-1 union select 1,count(*),concat((select database()),ceil(rand(0)*2)) as a from information_schema.tables grou…

数据结构:Map和Set(1)

搜索树 概念 若它的左子树不为空&#xff0c;则左子树上所有节点的值都小于根节点的值 若它的右子树不为空&#xff0c;则右子树上所有节点的值都大于根节点的值 它的左右子树也分别为二叉搜索树 这棵树的中序遍历结果是有序的 接下来我们来模拟一棵二叉搜索树&#xff0c…

Apifox日常使用(一键本地联调)

背景说明&#xff1a;现在的项目一般都是前后分离&#xff0c;线上出bug或者在进行联调时&#xff0c;有些时候后端需要重复模拟前端数据格式&#xff0c;在使用Apifox的情况下&#xff0c;如何快速造出后端需要的数据呢&#xff1f; 随便找一个网站&#xff0c;点开f12&#…

论文阅读—— UniDetector(cvpr2023)

arxiv&#xff1a;https://arxiv.org/abs/2303.11749 github&#xff1a;https://github.com/zhenyuw16/UniDetector 一、介绍 通用目标检测旨在检测场景那种的一切目标。现有的检测器依赖于大量数据集 通用的目标检测器应该有两个能力&#xff1a;1、可以利用多种来…

Linux难学?大神告诉你,Linux到底该怎么自学!

Linux难学&#xff1f;大神告诉你&#xff0c;Linux到底该怎么自学&#xff01; 就Linux这个学习曲线&#xff0c;如果不是有人带&#xff0c;分分钟会被自己劝退&#xff01;不过&#xff0c;要是你换个思路&#xff0c;不妨跟着这里的节奏&#xff0c;试试看&#xff1f; 知乎…

AI系统ChatGPT程序源码+AI绘画系统源码+支持GPT4.0+Midjourney绘画

一、AI创作系统 SparkAi创作系统是基于OpenAI很火的ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统&#xff0c;支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如…

帧间快速算法论文阅读

Low complexity inter coding scheme for Versatile Video Coding (VVC) 通过分析相邻CU的编码区域&#xff0c;预测当前CU的编码区域&#xff0c;以终止不必要的分割模式。 &#x1d436;&#x1d448;1、&#x1d436;&#x1d448;2、&#x1d436;&#x1d448;3、&#x…

3.4、Linux小程序:进度条

个人主页&#xff1a;Lei宝啊 愿所有美好如期而遇 目录 回车与换行的概念和区别 行缓冲区概念 进度条代码 version1 version2 version3 回车与换行的概念和区别 换行\n&#xff0c;回车\r 似乎无需多言 行缓冲区概念 这里我们通过例子来简单理解即可&#xff0c;深入…

wx 小程序不打开调试模式无法获取数据

问题开始 最近学习小程序&#xff0c;发布了一个体验版的小程序&#xff0c;发现正常扫码进入后接口数据是无法访问的。也就是原始数据,不过开启调试模式后,数据又一切正常&#xff0c;但是总不能让每个人都开启调试模式用吧&#xff0c;终于查阅资料后找到了解决问题的办法 …

10 索引优化与查询优化

文章目录 索引失效案例关联查询优化对于左外连接对于内连接JOIN语句原理简单嵌套循环连接SNLJ索引嵌套循环连接INLJ块嵌套循环连接BNLJHash Join 子查询优化排序优化filesort算法&#xff1a;双路排序和单路排序 分组优化分页优化优先考虑覆盖索引索引下推ICP使用条件 其他查询…

最新、最全、最详细的 K8S 学习笔记总结

Kubernetes就是一个编排容器的工具&#xff0c;一个可以管理应用全生命周期的工具&#xff0c;从创建应用&#xff0c;应用的部署&#xff0c;应用提供服务&#xff0c;扩容缩容应用&#xff0c;应用更新&#xff0c;都非常的方便&#xff0c;而且可以做到故障自愈。 K8S的前景…

笔记50:正则表达式入门宝典

引自&#xff1a;正则表达式是什么? - 知乎 中“龙吟九野”所写的一个回答&#xff0c;个人感觉看完之后如同醍醐灌顶&#xff0c;查了很多资料都没有这篇文章写的基础和通透&#xff0c;感觉是正则表达式扫盲好文&#xff0c;所以搬运一下&#xff0c;侵权删&#xff0c;感谢…