【看懂执行计划】访问表的方式

全表扫描(Full Table Scans, FTS)

  全表扫描是指Oracle在访问目标表里的数据时,会从该表所占用的第一个区(EXTENT)的第一个块(BLOCK)开始扫描,一直扫描到该表的高水位线(HWM,High Water Mark),这段范围内所有的数据块Oracle都必须读到。Oracle会对这期间读到的所有数据施加目标SQL的where条件过滤,最后返回满足要求的数据。
  Oracle在做全表扫描操作时会使用多块读,在目标表数据量不大时执行效率是非常高的。全表扫描最大的问题是执行时间不稳定、不可控,会随着目标表数据量的递增而递增。
  高水位线特性的副作用:即使DELETE删光了目标表里的所有数据,高水位线还是会在原来的位置,全表扫描的时候还是会扫描高水位线下所有的数据块。
【看懂执行计划】访问表的方式

会引起全表扫描的SQL

  1. 全模糊查询
  2. 查询条件中含有is null
  3. 查询条件中使用了不等于操作符(<>、!=)
  4. 对于组合索引,如果查询条件中没有前导列,也会引起全表扫描
  5. 对字段进行表达式操作
  6. 返回的行无任何限定条件

ROWID扫描(table access by ROWID)

  ROWID表示的是Oracle中数据行记录所在的物理存储位置,同数据块中的记录一一对应。Oracle通过ROWID去定位并访问数据的方法叫ROWID扫描。

ROWID的两层含义

  1. 根据SQL语句中输入的ROWID值直接去访问对应的行记录
    【看懂执行计划】访问表的方式

  2. 通过访问相关索引,再根据索引得到的ROWID访问数据
    【看懂执行计划】访问表的方式
    【看懂执行计划】访问表的方式

上一篇:for update 和 rowid 的区别


下一篇:看懂Oracle的执行计划