日期: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:查询的表没索引或返回所有的行;

?