一. 何时适用全表扫描(正面)
- 单表查询
表很小,索引可能就比表还大;
访问的数据占全表数据的百分比很大,索引访问的总成本大于全表扫描的成本;
相对于索引来说,表中的数据排列过于凌乱,表现出来就是索引的 clustering_factor 很大,导致索引的访问成本剧增。 - 多表连接
hash join的时候,内层表和外层表都可以使用全表扫描(对于某个单独的表的访问是否适用全表扫描,这个又回到了单表查询的情况);
nest loop的时候,外层表可以使用全表扫描,内层表一般不用全表扫描。
二. SQL语句使用不当(负面)
- 模糊查询
只有右模糊可以成功利用索引;
左模糊和全模糊都不能成功利用索引。 - 查询条件中含有
is null
原因:导致单索引失效;
解决办法:
索引列避免is null
;
使用组合索引。 - 查询条件中使用了不等于从操作符
<>
、!=
原因:不等于操作符限制了索引,即使字段上有索引;
解决方法:把不等于改成OR
。
column<>’aaa’ //全表扫描
column<’aaa’ OR column>’aaa’ //使用索引
-
OR
语句使用不当
OR
语句连接的条件中包含的列没有全部建立索引。 - 组合索引使用不当
查询条件中没有前导列,导致索引不起作用;
create index skip1 on emp5(job,empno);
select count(*) from emp5 where empno=7900; //全表扫描
select /*+ index(emp5 skip1)*/ count(*) from emp5 where empno=7900; //使用组合索引
使用组合索引时,在排序时应按照组合索引中各列顺序进行排序(即使只有一个列需要排序),否则性能较差。
create index skip1 on emp5(job,empno,date);
select job,empno from emp5 where job=’manager’and empno=’10’ ORDER BY date desc; //性能较差
select job,empno from emp5 where job=’manager’and empno=’10’ ORDER BY job,empno,date desc; //使用组合索引
-
UPDATA
语句updata了全部字段 - 对于多张大数据量的表
JOIN
原因:没有先分页,导致逻辑读很高;
解决方法:先分页再JOIN
。 SELECT COUNT(*)
- 对于反复执行的查询,
WHERE
子句中使用变量绑定可以降低解析时间,提高性能。
网友评论