下面的SQL 语句执行效率最高的是:
A)
select * from user 
where (userno='13798829822' )
   and (begintime>to_date('2004-1-30 8:20:11','yyyy-MM-dd hh24:mi:ss'))
   and (begintime<to_date('2004-9-30 8:20:11','yyyy-MM-dd hh24:mi:ss'));B)   
select * from user 
where (userno='13798829822' )
   and (begintime<to_date('2004-9-30 8:20:11','yyyy-MM-dd hh24:mi:ss'))
   and (begintime>to_date('2004-1-30 8:20:11','yyyy-MM-dd hh24:mi:ss'));
  
C)   
select * from user 
where 
       (begintime<to_date('2004-9-30 8:20:11','yyyy-MM-dd hh24:mi:ss'))
   and (begintime>to_date('2004-1-30 8:20:11','yyyy-MM-dd hh24:mi:ss'))
   and (userno='13798829822' );
  
D)   
select * from user 
where 
       (begintime>to_date('2004-1-30 8:20:11','yyyy-MM-dd hh24:mi:ss'))
   and (begintime<to_date('2004-9-30 8:20:11','yyyy-MM-dd hh24:mi:ss'))
   and (userno='13798829822' );

解决方案 »

  1.   


    ORACLE采用自下而上的顺序解析WHERE子句,根据这个原理,表之间的连接必须写在其他WHERE条件之前, 那些可以过滤掉最大数量记录的条件必须写在WHERE子句的末尾. 
      

  2.   

    为什么不是C,
    < 比 >号效率高
      

  3.   

    倒,楼上的误导阿
    哪有什么表之间的连接阿等式比较和范围比较
         当WHERE子句中有索引列, ORACLE不能合并它们,ORACLE将用范围比较.     举例:
         DEPTNO上有一个非唯一性索引,EMP_CAT也有一个非唯一性索引.
         SELECT ENAME
         FROM EMP
         WHERE DEPTNO > 20
         AND EMP_CAT = ‘A’;
        
         这里只有EMP_CAT索引被用到,然后所有的记录将逐条与DEPTNO条件进行比较. 执行路径如下:
         TABLE ACCESS BY ROWID ON EMP 
               INDEX RANGE SCAN ON CAT_IDXuserno和
    begintime是否有索引?
      

  4.   

    zmgowin(隐者(龙祖宗)) 的理由很对,可惜cd搞错了
    呵呵
      

  5.   

    能解答的更详细一些吗?
    把"ORACLE采用自下而上的顺序解析WHERE子句,根据这个原理,表之间的连接必须写在其他WHERE条件之前, 那些可以过滤掉最大数量记录的条件必须写在WHERE子句的末尾。"

    “等式比较和范围比较,当WHERE子句中有索引列, ORACLE不能合并它们,ORACLE将用范围比较.“

    “< 比 >号效率高“
    详细解释一下吧
      

  6.   

    1.根据userno='13798829822' 得到的数据有 a条
    2.根据userno='13798829822' and (begintime>to_date('2004-1-30 8:20:11','yyyy-MM-dd hh24:mi:ss'))得到的数据有 b条
    3.根据userno='13798829822' and (begintime>to_date('2004-1-30 8:20:11','yyyy-MM-dd hh24:mi:ss')) and (begintime<to_date('2004-9-30 8:20:11','yyyy-MM-dd hh24:mi:ss'))
    得到的数据有 c条
    4。自下而上就是从最后一个条件开始
    5.当a*b*c的积最小的时候就是最高,效率差的比率是多少就可以算出来了
      

  7.   

    难道Oracle这么弱智?优化器不能将四种写法优化成一种查询?真的是这样吗?
      

  8.   

    单纯地比较这么几条语句没有意义,
    因为不知道:
    索引是什么,
    数据的分布怎样,
    执行计划是RBO还是CBO
      

  9.   

    回复人: p0063665() ( ) 信誉:100  2004-10-18 09:49:00  得分: 0  
     
     
       难道Oracle这么弱智?优化器不能将四种写法优化成一种查询?真的是这样吗?
      
     
    同意
      

  10.   

    应该是 c 应为 oracle 在优化查询时是从后向前进行优化的
      

  11.   

    你的where子句中用了函数,好像都应该一样了
      

  12.   

    执行效率应该一样的。因为不存在多个表关连的情况。oracle的优化不会笨到这种程度。
      

  13.   

    应该一样巴,这三个条件对oracle优化器来说是一样的.即使效率有差别,也不会太多.
      

  14.   

    armyyd(不会游泳的猫) 
     同意说法。mssql是一样的
      

  15.   

    ORACLE采用自下而上的顺序解析WHERE子句,根据这个原理,表之间的连接必须写在其他WHERE条件之前, 那些可以过滤掉最大数量记录的条件必须写在WHERE子句的末尾. 
    =====-============================================
    关系数据库理论创建于上世纪70年代,风靡于80年代至今。其理论已经非常完备。关于表(关系)之间的连接,从理论上当然是先做投影运算,再作乘积(连接)运算合理,但是,这个理论是那样的浅显,以至于各个大的数据库公司早已经把它们做到自身的查询优化策略中去了。除非是异地分布式数据库,在同一数据库上(位于一个物理服务器上),这几条sql语句的效率是一样的,oracle更是把查询优化做到了骨髓,这样的小儿科优化,根本就不值得一提。
      

  16.   

    同意helysan(真水无香)  的说法!
    四条的效率几乎是一样的.
      

  17.   

    答案應是C,因類据sql的執行原則,將過最多的條件放在最后,它的執行是從右向左,從后向前的執行的
      

  18.   

    四个语句的效率差不多.
    据我之见:数据库优化方面主要应在以下几方面下功夫:
    1.尽量在SQL语句中少用NOT IN等关键词;
    2.尽量减少读表的次数和循环次数.
    3.优化SQL语句时,可用语言(如JAVA)和数据库结合的方法,这样能更好地起到优化作用,单独片面地讲究一两个数据库语句,起到的作用将会是不很明显的.此方法特别适合于一些较为复杂的多循环多数据的查询语句.
      

  19.   

    使用explain plan 看看执行计划不就得了。
    说实话这样的比较实在意义不大。
      

  20.   

    大家看看CSDN Oracle 电子杂志第一期吧,上面有关于此方面的问题。
      

  21.   

    如果你对表做过分析了而且使用默认的choose优化器的话,这四条语句的执行路径绝对一样的.
    反之执行路径是D最优.(不过最好说明哪些是索引)
      

  22.   

    Oracle默认自动优化,也可以使用手动优化(适合于专家使用)
    如果手动优化那么根据两条原则
    1.Oracle解析从后向前
    2.将筛选结果集小的先执行
    应该C最佳
    这边假设
    (begintime>to_date('2004-1-30 8:20:11','yyyy-MM-dd hh24:mi:ss'))
    会比
    (begintime<to_date('2004-9-30 8:20:11','yyyy-MM-dd hh24:mi:ss'))
    筛选调较多记录
      

  23.   

    一直天真的以为where语句的执行顺序是自上而下的,惭愧呀。
      

  24.   

    基于规则还是基于成本,这根oracle配置也有点关系