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

news2024/11/25 12:58:31

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

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

----带DETERMINISTIC的现象
create or replace function f_t(i_p int) return number DETERMINISTIC is
      i_rtn number;
    begin
      i_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 is
       i_rtn number;
    begin
       i_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.coloradmin.cn/o/1179485.html

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

相关文章

Android Mvp案例解析

目录 后端数据接口数据格式 App客户端布局逻辑主界面布局 M&#xff08;Model&#xff09;V&#xff08;View&#xff09;P&#xff08;Presenter&#xff09;OkhttpRetrofitRxJava网络http请求 Mvp架构-初学者MVP架构的契约者 后端数据接口 接口地址&#xff1a;https://apis.…

APP埋点:页面统计与事件统计

我们平时所说的埋点&#xff0c;可以大致分为两部分&#xff0c;一部分是统计APP页面访问情况&#xff0c;即页面统计&#xff1b;另外一部分是统计APP内的操作行为&#xff0c;及自定义事件统计。 一、页面统计 页面统计&#xff0c;可以统计应用内各个页面的访问次数&#x…

fiddler抓包拦截请求转发到其他地址

使用Fiddler拦截请求转发到指定地址方便于本地调试&#xff0c;不需要进行打包切换地址&#xff0c;可以加快问题的确定修复效果 内容&#xff1a; 1&#xff1a;首先给app进行设置代理抓包内容&#xff0c;给进行 https://blog.csdn.net/qq_43717814/article/details/84317038…

精读《算法题 - 二叉树中的最大路径和》

今天我们看一道 leetcode hard 难度题目&#xff1a;二叉树中的最大路径和。 题目 二叉树中的 路径 被定义为一条节点序列&#xff0c;序列中每对相邻节点之间都存在一条边。同一个节点在一条路径序列中 至多出现一次 。该路径 至少包含一个 节点&#xff0c;且不一定经过根节点…

Si4010 一款带有MCU SoC RF发射机芯片 无线遥控器

Si4010是一款完全集成的SoC RF发射机&#xff0c;带有嵌入式CIP-51 8051 MCU&#xff0c;专为1GHz以下ISM频带设计。该芯片针对电池供电的应用进行了优化&#xff0c;工作电压为1.8至3.6 V&#xff0c;待机电流小于10 nA的超低电流消耗。高功率放大器可提供高达10 dBm的输出功率…

服务器数据库中了elbie勒索病毒怎么办,elbie勒索病毒解密,数据恢复

网络技术的不断成熟&#xff0c;为企业的生产运营提供了强有力的支撑&#xff0c;但是&#xff0c;随之而来的网络安全威胁也不断增加。云天数据恢复中心陆陆续续接到很多企业的求助&#xff0c;企业的服务器数据库e遭到了elbie勒索病毒攻击&#xff0c;导致企业计算机系统瘫痪…

基于PHP语言的会员系统搭建(Docker版)

1、操作系统 ubuntu22 2、安装Docker # Add Dockers official GPG key: sudo apt-get update sudo apt-get install ca-certificates curl gnupg sudo install -m 0755 -d /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -…

【UART】UART QA

UART常见知识点整理 定义&#xff1a;Universal Asynchronous Receiver/Transmitter - 通用异步收发传输器。 特点&#xff1a;速率不快、可全双工、结构上一般由波特率产生器、UART发送器、UART接收器组成&#xff0c;硬件2-3线。 线&#xff1a;RXD&#xff0c;TXD&#xff0…

cordova Xcode打包ios以及发布流程(ionic3适用)

第一步 1、申请iOS证书 2、导入证书到钥匙串 第二步 1、xcode配置iOS证书 1.1用Xcode打开你的项目&#xff08;我的Xcode版本是新版&#xff09; 修改如下图 回到基本信息设置界面&#xff0c;Bundie 这项填写&#xff0c;最先创建的那个appid&#xff0c;跟创建iOS描述文件时选…

操作系统——文件空闲存储的空间管理(王道视频p64)

1.总体概述&#xff1a; 2.存储空间初始化&#xff1a; 3.空闲表法 4.空闲链&#xff1a; &#xff08;1&#xff09;空闲“盘块链”&#xff1a; &#xff08;2&#xff09;空闲“盘区链”&#xff1a; 5.位视图法&#xff1a; &#xff08;1&#xff09;基本结构&#xff1…

Leetcode刷题详解——二叉树剪枝

1. 题目链接&#xff1a;814. 二叉树剪枝 2. 题目描述&#xff1a; 给你二叉树的根结点 root &#xff0c;此外树的每个结点的值要么是 0 &#xff0c;要么是 1 。 返回移除了所有不包含 1 的子树的原二叉树。 节点 node 的子树为 node 本身加上所有 node 的后代。 示例 1&…

【Linux】进程管理命令,了解运维的五大性能监测

目录 一、程序与进程 1、程序是什么&#xff1f; 2、进程是什么&#xff1f;线程是什么&#xff1f;服务是什么&#xff1f; 3、进程的特点 4、进程使用内存的问题 二、运维相关命令学习 命令① ps 静态显示系统的进程 第一种静态查看进程信息&#xff1a;ps aux 第二…

解决若依Ruoyi 插入数据返回1,实现主键回填,返回主键ID

最开始的时候ruoyi 插入数据会返回1&#xff0c;开始以为是id&#xff0c;后来发现返回的逻辑是 0失败&#xff0c;1成功。 即便他利用mybatis设置了如下, useGeneratedKeys"true" keyProperty"id"​​​​​​​<selectKey></selectKey> 如…

【Redis】Redis整合SSMRedis中的缓存穿透、雪崩、击穿的原因以及解决方案(详解)

目录&#xff1a; 目录 一&#xff0c;SSM整合redis 二&#xff0c;redis注解式缓存 三&#xff0c;Redis中的缓存穿透、雪崩、击穿的原因以及解决方案&#xff08;附图&#xff09; 一&#xff0c;SSM整合redis 1.原因&#xff1a; 整合SSM和Redis可以提升系统的性能、可…

【迁移ORACLE数据到MogDB/openGauss时的字符集问题】

一、问题概述 ORACLE数据库在存储数据的时候&#xff0c;有时候会存在这样一种现象&#xff0c;一张表里的数据&#xff0c;既存在UTF8字符的&#xff0c;也存在GBK字符的&#xff0c;同时还有可能存在乱码数据。 NLS_CHARACTERSET是数据库字符集&#xff0c;NLS_NCHAR_CHARAC…

一键搞定!多个模型结果快速合并成一个三线表,model1、model2、model3。。。

欢迎参加郑老师2023年孟德尔随机化课程即将开始 发表文章后退款&#xff01;郑老师科研统计课程详情 在观察性研究中&#xff0c;我们经常同时构建多个统计模型&#xff0c;不同的模型放入不同的协变量&#xff0c;从零个的单因素回归分析&#xff0c;到多个协变量的回归模型。…

jenkins结合k8s部署动态slave

1、完成k8s连接 在完成jenkins的部署后现安装kubernets的插件 如果jenkins 是部署在k8s集群中只需要填写一下 如果是非本集群的部署则需要填写证书等 cat ./config echo ‘certificate-authority-data-value’ | base64 -d > ./ca.crt echo ‘client-certificate-data’ |…

MySQL 排序,分组,Limit的优化策略

目录 1. MySQL 中的两种排序方式 2. 排序优化策略 2.1 对排序字段添加索引 2.2 可以和WHERT字段创建联合索引 2.3 优化 FilerSort 排序方式 3. 分组优化策略 3.1 能WHERE不HAVING 3.2 减少ORDER BY&#xff0c;GROUP BY&#xff0c;DISTINCT 3.3 遵照最左前缀法则 4.…

python 之 正则表达式模块re

文章目录 findall例子&#xff1a;特点和注意事项&#xff1a; match示例&#xff1a;match 对象的方法和属性&#xff1a;注意事项&#xff1a; search示例&#xff1a;match 对象的方法和属性&#xff1a;注意事项&#xff1a; split示例&#xff1a;参数说明&#xff1a;注意…

民宿酒店服务预约小程序的作用

民宿往往是旅游者们前往某个城市感受风情常住的地方&#xff0c;也因此在景区或特定地方&#xff0c;总是不乏大小民宿品牌&#xff0c;但除了市场高需求外&#xff0c;商家们所遇的痛点也不少&#xff1a; 1、获客引流难 民宿生意虽然需求量高&#xff0c;但各家品牌众多&am…