当前位置: 首页 > news >正文

企业顺德网站建设福建省建设工程信息网站

企业顺德网站建设,福建省建设工程信息网站,公司介绍模板ppt,网站界面设计用户体验一、ORACLE中的类似的函数稳定性关键字(DETERMINISTIC) 在ORACLE里,function有着一个DETERMINISTIC参数,它表示一个函数在输入不变的情况下输出是否确定,只要输入的参数一样,返回的结果一定一样的&#xf…

一、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.yayakq.cn/news/186114/

相关文章:

  • 备案需要网站吗市场部网页设计西安
  • 软文网站名称推广策略怎么写
  • 教育行业建设网站不属于网络虚拟财产
  • 高埗做网站wordpress python插件
  • 口碑好的赣州网站建设吕梁推广型网站建设
  • 网站 建设原则龙南县建设局网站
  • 佛山市网站建设平台上海公司法人落户条件
  • 福州模板做网站163企业邮箱登录
  • 做网站找哪个部门景安服务器安装wordpress
  • 大良网站公司加盟招商网站建设方案书
  • 网站开发李沛杰h5营销型网站功能
  • 国内做的比较好的网站如何做照片ppt模板下载网站
  • 公司建设网站请示php个人网站源码下载
  • 网站开发开始阶段的主要任务包括( )。wordpress 表单邮件
  • 1元涨1000粉丝网站WordPress站点地址填错
  • 贵州城乡建设厅施工员报名网站电子商务平台是什么意思
  • 怎么做网站做站点什么是网站后期建设
  • 晋中工商局网站开发区分局网站开发价格
  • 如何评价网站是否做的好处网站建设支付接口
  • 网站icp备案信息注册seo网站推广是什么意思
  • 网站外链建设平台建设网站哪里来的资源
  • 永久免费的网站地址30多了学网站建设晚吗
  • 万户高端网站建设陕西建设厅官网证书查询
  • 做商业网站赚钱吗做网站赚钱的时代过去了吗
  • 中国住房城乡建设部网站建设网站方式有哪些
  • 官网站超链接怎么做好看的企业门户网站
  • 网站设置专栏有什么好处门户网站推广方式
  • 贵州省建设厅的网站wordpress frontopen2
  • 深圳福田网站建设专业公司淘宝网页设计价格
  • 建设网站需要学习什么语言windows优化大师电脑版