日期:2014-05-17  浏览次数:20756 次

为啥这样sql(oracle)语句执行速度比较快,原因
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')

奇怪

------解决方案--------------------
nvl(t.a,t.b)
===================
在字段名称上使用函数不是一个好习惯,这会导致索引失效,除非有相应的函数索引。
------解决方案--------------------
选中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

------解决方案--------------------
9楼说的对,
第一句如果在a,b上都有索引,查询就会直接通过索引查询,

第二句一般就是直接表扫描。

大数据量情况下差别很明显。