日期:2014-05-16 浏览次数:20547 次
全表扫描:1:模糊查询:like '%……%';避免全模糊,对右模糊like '……%'会使用索引;左模糊like '%……'无法直接使用索引,可利用reverse + function index形式变成like '……%' 2:查询条件使用不等于操作符(<>、!=)的select语句执行慢;原因:不等于操作操作符会限制索引,引起全表扫描; 解决方法:把不等于操作符改成or,使用索引避免全扫:column <> 'name'改成 column > 'paramSmall' or column < 'paramBig' 3:查询条件含is null的select语句执行慢,查询字段is null引起单索引失效,最好索引列都是not null的,对is null可建立组合索引,nvl(column,0),对表和索引analyse后, is null查询可重新启用索引查找,但效率还不值得肯定;is not null永远不会使用索引,一般大数据量不使用is null 查询 nvl(expressiona,expressionb):返回第一个不为空的值,若都为空则返回null 4:组合索引:排序应按照组合索引中各列顺序进行排序,即使索引中只有一列要排序,如:create index skip1 on emp5(job,empno,date); select job,empno from emp5 where job='manager' and empno='10' order by job,empno,date desc; 实际上只查询出符合job='manager' and empno='10'条件的记录并按date降序排列,但写成order by date desc性能较差; 5:对多张大数据量表JOIN,要先分页再JOIN,否则逻辑读会很高; 6:select count(*) from table:(这里用count代表所有聚合函数),不带任何条件的count会引起全表扫描,且无任何业务意义; 7:sql的where条件要绑定变量:如where column=:1,不要写成where column='aaa',即软解析,避免每次执行时重新分析; 8:or语句使用不当会引起全表扫描:原因:若where子句有两条件,一个有索引,一个没索引,使用or则引起全表扫描, 如:where A=:1 or B=:2,A上有索引,B上没索引,则比较B=:2时会重新开始全表扫描; 9:使用组合索引,若查询条件无前导列,那索引不起作用,从9i开始,引入索引跳跃式扫描,可允许优化器使用组合索引, 即便索引的前导列没出现在where子句中,如:create index skip1 on emp5(job,empno); 全索引扫描:select count(*) from emp5 where empno=7900; 索引跳跃式扫描select /*+ index(emp5 skip1)*/ count(*) from emp5 where empno=7900;前者使用全表扫描,后者使用组合索引; 10:查询的表没索引或返回所有的行;
?