全表扫描(Full Table Scans, FTS)
全表扫描是指Oracle在访问目标表里的数据时,会从该表所占用的第一个区(EXTENT)的第一个块(BLOCK)开始扫描,一直扫描到该表的高水位线(HWM,High Water Mark),这段范围内所有的数据块Oracle都必须读到。Oracle会对这期间读到的所有数据施加目标SQL的where条件过滤,最后返回满足要求的数据。
Oracle在做全表扫描操作时会使用多块读,在目标表数据量不大时执行效率是非常高的。全表扫描最大的问题是执行时间不稳定、不可控,会随着目标表数据量的递增而递增。
高水位线特性的副作用:即使DELETE删光了目标表里的所有数据,高水位线还是会在原来的位置,全表扫描的时候还是会扫描高水位线下所有的数据块。
会引起全表扫描的SQL
- 全模糊查询
- 查询条件中含有is null
- 查询条件中使用了不等于操作符(<>、!=)
- 对于组合索引,如果查询条件中没有前导列,也会引起全表扫描
- 对字段进行表达式操作
- 返回的行无任何限定条件
ROWID扫描(table access by ROWID)
ROWID表示的是Oracle中数据行记录所在的物理存储位置,同数据块中的记录一一对应。Oracle通过ROWID去定位并访问数据的方法叫ROWID扫描。
ROWID的两层含义
-
根据SQL语句中输入的ROWID值直接去访问对应的行记录
-
通过访问相关索引,再根据索引得到的ROWID访问数据