资讯专栏INFORMATION COLUMN

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

IT那活儿 / 2110人阅读
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持平,通知应用再次测试,反馈没有问题。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/130110.html

相关文章

  • 使用BenchmarkSQL对Polardb数据库进行TPCC测试

    使用BenchmarkSQL对Polardb数据库进行TPCC测试 img{ display:block; margin:0 auto !important; width:100%; } body{ width:...

    IT那活儿 评论0 收藏547
  • 新书推荐 |《PostgreSQL实战》出版(提供样章下载)

    摘要:作者谭峰张文升出版日期年月页数页定价元本书特色中国开源软件推进联盟分会特聘专家撰写,国内多位开源数据库专家鼎力推荐。张文升中国开源软件推进联盟分会核心成员之一。 很高兴《PostgreSQL实战》一书终于出版,本书大体上系统总结了笔者 PostgreSQL DBA 职业生涯的经验总结,本书的另一位作者张文升拥有丰富的PostgreSQL运维经验,目前就职于探探科技任首席PostgreS...

    Martin91 评论0 收藏0

发表评论

0条评论

IT那活儿

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<