这应该根据条件的不同,oracle的优化器会自己优化.

解决方案 »

  1.   

    请问oracle专家:
       oracle优化器会自己优化多条件where子句吗?
      

  2.   

    转:
    WHERE子句中的连接顺序. 
       ORACLE采用自下而上的顺序解析WHERE子句,根据这个原理,表之间的连接必须写在其他WHERE条件之前, 那些可以过滤掉最大数量记录的条件必须写在WHERE子句的末尾. 
    例如: 
    (低效,执行时间156.3秒) 
    SELECT … 
    FROM EMP E 
    WHERE SAL > 50000 
    AND JOB = ‘MANAGER’ 
    AND 25 < (SELECT COUNT(*) FROM EMP 
                 WHERE MGR=E.EMPNO); 
    (高效,执行时间10.6秒) 
    SELECT … 
    FROM EMP E 
    WHERE 25 < (SELECT COUNT(*) FROM EMP 
                 WHERE MGR=E.EMPNO) 
    AND SAL > 50000 
    AND JOB = ‘MANAGER’;
      

  3.   

    yeah,that's what i want.
    thank you,zmgowin
      

  4.   

    but,is that always true?
      

  5.   

    但是,按先后顺序来执行
    SELECT … 
    FROM EMP E 
    WHERE SAL > 50000 
    AND JOB = ‘MANAGER’ 
    AND 25 < (SELECT COUNT(*) FROM EMP 
                 WHERE MGR=E.EMPNO); 与SELECT … 
    FROM EMP E 
    WHERE 25 < (SELECT COUNT(*) FROM EMP 
                 WHERE MGR=E.EMPNO) 
    AND SAL > 50000 
    AND JOB = ‘MANAGER’;执行时间应该一致才对啊,为什么会出现那么大的差异呢?
      

  6.   

    这里有一些sql优化的文档,可以参考一下:http://www.51blog.net/artCatolog.asp?classID=6
      

  7.   

    thanks a lot for all who participated in this question.
    but...
    如果表里有索引呢?
      

  8.   

    好像是这么说的,如果是基于规则的优化方式,那么排列是有先后顺序的区别,如果是基于成本的,那么排名不分先后,oracle自己会选择的,就不用考虑这么无聊的事情了,还排语句的先后顺序:)
      

  9.   

    看来跟优化器有关,但我想最好还是还是把过滤数据最多的放到最后,因为除了手动,我们没办法控制oracle用哪个优化器。
    是不是这个道理?
      

  10.   

    不太理解人工干预有什么不可以那,你可以更改为基于成本的,然后就一直用这种不就行了?跟oracle的缺省值是什么有什么关系,哦,你是不是理解为每次都要改变,你可以写个脚本改过来就一直改过来了
      

  11.   

    谢谢浮舟
    oracle默认是基于规则的吧
      

  12.   

    默认是基于choose的,然后oracle会判断选择是基于规则还是基于成本
      

  13.   

    可能是从后往前的.你不妨写个书写有错误的SQL语句,有至少两个condition,有至少两个书写错误,看系统编译后如何给你"错误提示"