1.在polardb-o执行结果返回14秒
查询得出,统计信息page数量和实际差别20%的表没有,统计信息也没有问题。
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,那么它的值只有在读到一条记录的时候才能确定,这样就不能走索引了。
简单描述如下:
IMMUTABLE(非常稳定)
表示该函数不能修改数据库并且对于给定的参数值总是会返回相同的值。也就是说,它不会做数据库查找或者使用没有在其参数列表中直接出现的信息。如果给定合格选项,任何用全常量参数对该函数的额调用可以立刻用该函数值替换。
STABLE(稳定)
表示该函数不能修改数据库,并且对于相同的参数值,它在一次表扫描中将返回相同的结果。在大多数情况下是的。在单个表扫描中,对相同的参数值返回相同的结果,但结果将通过SQL语句进行更改。结果取决于数据库查找或参数值。current_timestamp系列函数是STABLE;值在执行中不会改变。
VOLATILE(不稳定)
默认为VOLATILE。表示该函数的值在一次表扫描中都有可能改变,因此不能做优化。在这种意义上,相对较少的数据库函数是不稳定的。例如:random(), currval(), timeofday()。任何具有副作用的函数的都不稳定的,即使其结果是可预测的。例如:setval().
理解测试:
Oracle的sysdate的值为语句开始的值,并且在整个sql的生命周期中是保持不变的。
Polardb-o的sysdate的值,在每次读一行的时候重新计算了,这样是不能走索引的。
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测试 img{ display:block; margin:0 auto !important; width:100%; } body{ width:...
摘要:作者谭峰张文升出版日期年月页数页定价元本书特色中国开源软件推进联盟分会特聘专家撰写,国内多位开源数据库专家鼎力推荐。张文升中国开源软件推进联盟分会核心成员之一。 很高兴《PostgreSQL实战》一书终于出版,本书大体上系统总结了笔者 PostgreSQL DBA 职业生涯的经验总结,本书的另一位作者张文升拥有丰富的PostgreSQL运维经验,目前就职于探探科技任首席PostgreS...
阅读 1346·2023-01-11 13:20
阅读 1684·2023-01-11 13:20
阅读 1132·2023-01-11 13:20
阅读 1858·2023-01-11 13:20
阅读 4100·2023-01-11 13:20
阅读 2704·2023-01-11 13:20
阅读 1385·2023-01-11 13:20
阅读 3597·2023-01-11 13:20