数据库
首页 > 数据库> > Oracle迁移到Polardb-O性能优化案例

Oracle迁移到Polardb-O性能优化案例

作者:互联网

1.在polardb-o执行结果返回14秒

图片


2.在oracle执行结果返回值0.2秒

图片


3.查看polardb-o的执行计划

图片


4.为啥执行计划不一样呢,统计信息的问题吗?

图片


查询得出,统计信息page数量和实际差别20%的表没有,统计信息也没有问题。


5.那case_time这个条件有啥特殊呢?

SELECTordersum     as ordersum,

onestatus   as onestatus,

twostatus   as twostatus,

threestatus as threestatus,

fourstatus  as fourstatus,

archive     as archive,

elevenstatusas elevenstatus

FROM(SELECT ***

FROMxx a

***

ANDa.case_time >= trunc(sysdate - 30, 'dd'))


尝试将sysdate修改为now,执行时间1.72秒,效率提升很多.

图片


这个sysdate和now有啥不一样呢?

图片

两者的provolatile分别为s和v,原因是sysdate这个函数被标记为了volatile,那么它的值只有在读到一条记录的时候才能确定,这样就不能走索引了。


6.pg的函数有易变性,而oracle数据库没有这个概念。


简单描述如下:


IMMUTABLE(非常稳定)

表示该函数不能修改数据库并且对于给定的参数值总是会返回相同的值。也就是说,它不会做数据库查找或者使用没有在其参数列表中直接出现的信息。如果给定合格选项,任何用全常量参数对该函数的额调用可以立刻用该函数值替换。


STABLE(稳定)

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


VOLATILE(不稳定)

默认为VOLATILE。表示该函数的值在一次表扫描中都有可能改变,因此不能做优化。在这种意义上,相对较少的数据库函数是不稳定的。例如:random(), currval(), timeofday()。任何具有副作用的函数的都不稳定的,即使其结果是可预测的。例如:setval().


理解测试:

Oracle的sysdate的值为语句开始的值,并且在整个sql的生命周期中是保持不变的。


Polardb-o的sysdate的值,在每次读一行的时候重新计算了,这样是不能走索引的。

图片


图片


7.修改polardb-o的sysdate函数provolatile值。

alterfunction sysdate() strict stable;

或updatepg_proc set provolatile = 's' where proname = 'sysdate';

再次执行查询语句,返回时间2.4秒,耗时基本和oracle持平,通知应用再次测试,反馈没有问题。

图片


标签:sysdate,函数,数据库,参数值,Oracle,迁移,执行,polardb,Polardb
来源: https://blog.51cto.com/u_15127668/2800504