资讯专栏INFORMATION COLUMN

性能优化之oracle SQL执行计划异常诊断一例

IT那活儿 / 2013人阅读
性能优化之oracle SQL执行计划异常诊断一例

亲爱滴伙伴们,本萎砖家又来了。这次咱说说SQL加了并行hint,但并行却跑不起来的小案例。这事儿的起因是应用侧一哥们儿反馈一个存储过程平时只要1个小时就可以跑完,这次跑了4个多小时还望不到头儿,找过来需要友情协助。


干运维的都是苦命孩子,大家能互相帮衬的就互相帮衬点儿,你说要是找我借个十块八块钱的话,我也帮不上忙。这手到擒来的活儿,还是义不容辞的撸起袖子,开始排查问题原因。


根据这哥们儿提供过来的sql文本,在库里找到了对应的会话及正在运行的SQL。查看session相关属性信息,确定与跟之前运行的时间相差很大(看来这大兄弟也是实在人,硬是多扛了3个多小时才喊痛)。看到这个差别第一反应是执行计划的相关原因导致,核实执行计划后,果然和怀疑的一样,执行计划一直在变。


既然执行计划总是在变,那咱就看看这2个执行计划的区别在哪儿?

执行计划显示SQL是一个insert....select....语句,SQL中有/*+APPEND ENABLE_PARALLEL_DMLPARALLEL("a",8)+*/开启PDML并行的hint,其中低效的执行计划显示DML并行无效(PDMLdisabled because object is not decorated with parallelclause)。


我们继续分析执行计划发现高效执行计划在预插入数据的目标表insert及其索引维护动作均开启了并行,但低效执行计划没有。


问题点出现了:

  • 为啥ENABLE_PARALLEL_DMLhint有时候起作用,有时候就失效了呢?

  • PDMLdisabled because object is not decorated with parallel clause?

  • 为啥会报对象没有用parallel子句修饰?难道是hint写错了?


顺着这个思路继续查看sql书写规范,果然有发现,别名上多了双引


去掉双引号测试一切回归正常:


其实,这里有一个更稳妥的老司机的做法可以防止hint写错影响并行的开启,使用会话级别打开并行:

  • altersession force parallel query parallel 16;

  • altersession force parallel dml parallel 16;

该方式就算hint写错了也没关系,照样会走并行。


总结:

从这个例子我们可以看到一个小小的双引号竟然可以导致parallel hint间隙性失效,真是应了那句老话儿,一粒老鼠屎坏了一锅汤。所以说工作中规范很重要。好了,本次分享到此结束,咱下回分享再见。

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

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

相关文章

  • 开源|性能优化利器:数据库审核平台Themis的选型与实践

    摘要:正是存在问题,促使我们考虑引入数据库审核平台。的确,与很多互联网公司相比,数据库数十套的估摸并不是太大但与互联网类公司不同,类似宜信这类金融类公司对数据库的依赖性更大,大量的应用是重数据库类的,且其使用复杂程度也远比互联网类的复杂。 作者:韩锋 出处:DBAplus社群分享 Themis开源地址:https://github.com/CreditEaseDBA 拓展阅读:宜信开源|数...

    wenhai.he 评论0 收藏0
  • DBASK问答集萃(2)

    摘要:新晋技术专家下面是墨天轮部分新晋的技术专家。大家可以点击往期阅读墨天轮技术专家邀请函了解详情,申请成为我们的技术专家,加入专家团队,与我们一起创建一个开放互助的数据库技术社区。新关联公众号墨天轮是一个开放互助的数据库技术社区。 引言 近期我们在DBASK小程序增加了数据库 MongoDB、Redis、 Elasticsearch、DB2、Weblogic 等新的的专题栏目和一些新的技术...

    liuchengxu 评论0 收藏0

发表评论

0条评论

IT那活儿

|高级讲师

TA的文章

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