Oracle执行计划详细解读.pptVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
实例-续3 第一反应:加规则提示 select /*+ rule */ planbill.cplanbid, sum……. 好像有提高,只有一个FullScan了。但是这个计划执行起来更差,原因是:内部驱动表bd_invcl到执行计划表没有用到任何条件,结果集是两个表的完全关联 实例-续4 看看内部的子查询情况 SELECT po_plan_b.cplanbid,…, aa.invclasscode FROM po_plan_h, po_plan_b, bd_invcl aa where po_plan_h.cplanhid = po_plan_b.cplanhid and po_plan_h.dr = 0 and po_plan_b.dr = 0 and aa.pk_invcl ( + ) = po_plan_b.cobj2id and po_plan_h.dprocessdate = 2005-04-19 实例-续5 发现计划表上相应日期列没有索引。子表上的主表字段也没有索引。加上索引。 CREATE INDEX PO_PLAN_H_IDX1 ON PO_PLAN_H(DPROCESSDATE) ; CREATE INDEX IDX_PO_PLAN_B_1 ON PO_PLAN_B(CPLANHID) ; 内部子查询已经没有太大问题。但是整个查询仍然没有起色。 实例-续6 在内部也都用上了索引,但是效果仍不好,速度照样慢. 看到执行表使用的索引是I_MPP_PLANEXEX_4 索引列(DSTARTDATE, DENDDATE)-删除 先关联了执行表,然后再关联最外层的存货分类表,对数据没有起到过滤作用 实例-续7 仔细分析一下外围关联条件: where po_planexe.pk_corp = planbill.pk_corp and po_planexe.dr = 0 and ( po_planexe.cdeptid = planbill.cobj1id or planbill.cobj1id is null) and ( po_planexe.cinvmandocid = planbill.cobj3id or planbill.cobj3id is null ) and invclass.pk_invcl = po_planexe.cinvclassid and (( invclass.invclasscode like planbill.invclasscode || % and planbill.invclasscode is not null ) or planbill.cobj2id is null ) and po_planexe.dstartdate = planbill.dstartdate and po_planexe.denddate = planbill.denddate 这里的po_planexe.cdeptid = planbill.cobj1id or planbill.cobj1id is null和 po_planexe.cinvmandocid = planbill.cobj3id or planbill.cobj3id is null 是无法使用执行表上的部门和存货索引。 (部门上单独加索引???) 采购计划表上有一个逻辑是:存货和存货分类两个列是互斥的,且必有一个不为空. 我们可以使用这个逻辑将条件分开,而不是写在一起。 and (( po_planexe.cinvmandocid = planbill.cobj3id and planbill.cobj2id is null ) or (po_planexe.cinvclassid = invclass.pk_invcl ….. )) 但是,对存货不需要存货分类表,而对存货分类因为可以不定义到最末级,因此必须关联两次存货分类表。 最后可行的解决办法是将两个查询UNION达到解决问题 实例-续8 先按照计划表上有存货的进行查询 select /*+ rule */ planbill.cplanbid, ….. from ( SELECT po_plan_b.cplanbid, po_plan_h.pk_corp, FROM po_plan_h, po_plan_b where po_plan_h.cplanhid = po_plan_b.cplanhid and po_plan_h.dr = 0

文档评论(0)

tangtianbao1 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档