为啥这样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上都有索引,查询就会直接通过索引查询,
第二句一般就是直接表扫描。
大数据量情况下差别很明显。