看懂执行计划之表相关执行计划
全表扫描(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 访问数据
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 宸汐缘!
评论