哪些情况会引起/要求全表扫描?

一. 何时适用全表扫描(正面)

  1. 单表查询
    表很小,索引可能就比表还大;
    访问的数据占全表数据的百分比很大,索引访问的总成本大于全表扫描的成本;
    相对于索引来说,表中的数据排列过于凌乱,表现出来就是索引的 clustering_factor 很大,导致索引的访问成本剧增。
  2. 多表连接
    hash join的时候,内层表和外层表都可以使用全表扫描(对于某个单独的表的访问是否适用全表扫描,这个又回到了单表查询的情况);
    nest loop的时候,外层表可以使用全表扫描,内层表一般不用全表扫描。

二. SQL语句使用不当(负面)

  1. 模糊查询
    只有右模糊可以成功利用索引;
    左模糊和全模糊都不能成功利用索引。
  2. 查询条件中含有is null
    原因:导致单索引失效;
    解决办法:
    索引列避免is null
    使用组合索引。
  3. 查询条件中使用了不等于从操作符<>!=
    原因:不等于操作符限制了索引,即使字段上有索引;
    解决方法:把不等于改成OR
column<>’aaa’ //全表扫描
column<’aaa’ OR column>’aaa’ //使用索引
  1. OR语句使用不当
    OR语句连接的条件中包含的列没有全部建立索引。
  2. 组合索引使用不当
    查询条件中没有前导列,导致索引不起作用;
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; //使用组合索引
  1. UPDATA语句updata了全部字段
  2. 对于多张大数据量的表JOIN
    原因:没有先分页,导致逻辑读很高;
    解决方法:先分页再JOIN
  3. SELECT COUNT(*)
  4. 对于反复执行的查询,WHERE子句中使用变量绑定可以降低解析时间,提高性能。

你可能感兴趣的:(哪些情况会引起/要求全表扫描?)