首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > 其他数据库 >

数据库优化-全表扫描

2012-07-28 
数据库优化----全表扫描全表扫描:1:模糊查询:like %……%;避免全模糊,对右模糊like ……%会使用索引;左模

数据库优化----全表扫描

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

?

热点排行