为啥这样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_ROWS311187
TABLE ACCESS FULLMW_APPMWT_GRADEINFO311187
这代表全表扫描
SELECT STATEMENT, GOAL = ALL_ROWS1117
TABLE ACCESS BY INDEX ROWIDMW_APPMWT_GRADEINFO1117
INDEX UNIQUE SCANMW_APPPK_MWT_GRADEINFO01
这代表走索引
另外,where条件里,一般都是左边是字段名,右边是值或条件,尽量把计算和函数放到右边
比如 where a.col/5 > 3 的效率要低于 where a.col > 3*5
[解决办法]
9楼说的对,
第一句如果在a,b上都有索引,查询就会直接通过索引查询,
第二句一般就是直接表扫描。
大数据量情况下差别很明显。