select * from table t where  t.a >= to_date('2013-01-15 08:00', 'yyyy-mm-dd hh24:mi')  or t.b >=to_date('2013-01-15 08:00', 'yyyy-mm-dd hh24:mi')  快于select * from table t where  nvl(t.a,t.b) >= to_date('2013-01-15 08:00', 'yyyy-mm-dd hh24:mi')奇怪

解决方案 »

  1.   

    你这两个sql根本就不等价吧 这么比较有意义吗?
    想知道为什么快,看查询计划就可以了 有走索引的 有不走索引的 速度当然不一样
      

  2.   

    如果是等价的 在nvl(t.a,t.b)耗的时间应该不少  在等式左边 对数据字段进行转换或者函数 很耗时的..
      

  3.   

    我认为是因为nvl(t.a,t.b)会先对t.a是否为null进行判断导致的
      

  4.   

    nvl(t.a,t.b)
    ===================
    在字段名称上使用函数不是一个好习惯,这会导致索引失效,除非有相应的函数索引。
      

  5.   

    大哥,你的意思是:
    如果nvl(t.a,t.b),这样的到的比如是t.a 
    就算a列有索引,在搜索的时候,也没用到索引吗?小弟,对数据库可以说是一清二白啊,忘赐教
      

  6.   

    选中sql语句,按F5,就可以看到查询计划
    SELECT STATEMENT, GOAL = ALL_ROWS 3 11 187
     TABLE ACCESS FULL MW_APP MWT_GRADEINFO 3 11 187

    这代表全表扫描
    SELECT STATEMENT, GOAL = ALL_ROWS 1 1 17
     TABLE ACCESS BY INDEX ROWID MW_APP MWT_GRADEINFO 1 1 17
      INDEX UNIQUE SCAN MW_APP PK_MWT_GRADEINFO 0 1

    这代表走索引
    另外,where条件里,一般都是左边是字段名,右边是值或条件,尽量把计算和函数放到右边
    比如 where a.col/5 > 3 的效率要低于 where a.col > 3*5