select infoID, phototype, photoFtype 
from  basicin  where infoTypeID in (1,2,3,4,11,13,15) and photoImage is not null花了6:05秒
select infoID, phototype, photoFtype 
from  basicin  
where (infoTypeID =1 or infoTypeID=2 or infoTypeID=3 or infoTypeID=4  or infoTypeID=11  or infoTypeID=13 or infoTypeID=15)and photoImage is not null 花了6:06秒select infoID, phototype, photoFtype 
from  basicin 
where ((((((infoTypeID =1 or infoTypeID=2) or infoTypeID=3) or infoTypeID=4) or infoTypeID=11) or infoTypeID=13) or infoTypeID=15)
and photoImage is not null :花了6:15秒我的表里总共有40万条记录,查出来的总数为10万条记录,书上说第三种执行效率最高,第二种次之,第一种效率最低,可是我实际上执行之后却是相反的,这是为什么呢?

解决方案 »

  1.   

    第1,2条语句所采用的执行计划应该是完全相同的,相差一点点可能与执行时的环境有关.第3条查询和前两条是有区别的,PL/SQL里按F5你可以看一下plan.
      

  2.   

    6:06, 6:15 这在时间根本就是没有什么区别,可以忽略不计的。原则上来讲,哪种写法简单应该用哪种,所以第1种为优。主要还是看执行计划,40W取出10W,25%的比率了,CBO极有可能走fts(全表扫描)楼主看看3个语句的执计划就知道了
      

  3.   

    模仿此贴中的分析(如:步骤 1A),比照一下:
    http://www.oracle.com/technology/global/cn/pub/articles/sharma_indexes.html
      

  4.   


    说的不多,40W取出10W,25%大于10%,这时候CBO(cost-based optimizer)就会走fts
    就是:只要在10%以上。oracle就会用full table scan
    就是基于成本的优化,就是全表扫描,不通过index scan
      

  5.   

    所以,sql越简练,执行效率就会越高,所以第一种花的时间最少!
      

  6.   

    第一,第二种的结果肯定是一样的,第三种没仔细看.原则上来说,第二种应该速度要快些.至于为什么出现第一种比第二种快,就不清楚了.你尝试对infoTypeID加上索引试试.