select d.servnumber,b.privid,a.smpcode,b.startdate,b.enddate
from  a, b, c, d
where a.privid=b.privid
and a.plattype='OCS'
and b.subsid=c.subsid
and b.nvl(b.enddate,sysdate+1)>sysdate
and b.prodid like 'OEA.PPS%'
and c.servnumber=d.servnumber
and c.active=1;
select d.servnumber,b.privid,a.smpcode,b.startdate,b.enddate
from  a, b, c, d
where a.privid=b.privid
and b.subsid=c.subsid
and c.servnumber=d.servnumber
and a.plattype='OCS'
and b.nvl(b.enddate,sysdate+1)>sysdate
and b.prodid like 'OEA.PPS%'
and c.active=1;-------
各位高手,你们好!
请问以上两段脚本,哪一段的效率高一点?
是不是所有的关联字段都放在最前面的效率高,还是不管关联字段放在哪,只要先将查出的数据比较少的关联字段放在最后,查出最多数据的关联字段放在最前,
就可以了,是吗?
另,and b.nvl(b.enddate,sysdate+1)>sysdate 这一段是不是比 and (b.enddate>sysdate or b.enddate is null) 的效率要高?各位有什么比较简短的口决或尧口令可以方便记录sql的优化的吗?
---------
急复,谢谢!

解决方案 »

  1.   

    nvl(b.enddate,sysdate+1)>sysdate 对nvl(b.enddate,sysdate+1)建函数索引效率会高些
    (b.enddate>sysdate or b.enddate is null
    条件里出现is null或is not null
    不走索引
    至于条件放在哪儿,应该影响不大
      

  2.   


    1,主要看执行计划,你的关联条件放在前面或者后面没有差别,因为oracle是优先执行判断关联条件的。2,你的那个b.nvl(b.enddate,sysdate+1)>sysdate;是有点消耗资源啊,建议针对这个建立函数索引吧。3,在理论上,and b.nvl(b.enddate,sysdate+1)>sysdate 没有 and (b.enddate>sysdate or b.enddate is null)效率高,因为后面这句是标准的计算机程序逻辑,而前面的语句计算机还需要先判断,再走后面的语句呢?实际过程中,这点可以忽略不计的。
      

  3.   

    主要看执行计划,你的关联条件放在前面或者后面没有差别,因为oracle CBO优化器会做分析处理的。