读书人

为何这样sql(oracle)语句执行速度比较

发布时间: 2013-01-28 11:49:56 作者: rapoo

为啥这样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上都有索引,查询就会直接通过索引查询,

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

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

读书人网 >oracle

热点推荐