美文网首页
哪些情况会引起/要求全表扫描?

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

作者: ZYJ2016 | 来源:发表于2017-10-11 23:34 被阅读0次

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

    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子句中使用变量绑定可以降低解析时间,提高性能。

    相关文章

      网友评论

          本文标题:哪些情况会引起/要求全表扫描?

          本文链接:https://www.haomeiwen.com/subject/xkvgyxtx.html