首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> Oracle 資料庫 >> Oracle 資料庫基礎

高手详解 Oracle 索引扫描机制:从唯一扫描到快速全扫描

     編輯:Oracle 資料庫基礎

索引扫描两步走

  1. 扫描索引结构获取 ROWID (逻辑 I/O,多半在内存)。
  2. 按 ROWID 回表访问数据块 (物理 I/O 概率高,耗时)。

若查询列全在索引中 (覆盖索引),可省略第 2 步,效果显著。

四大扫描类型对比

类型触发条件排序多块读典型 Cost
INDEX UNIQUE SCAN唯一索引 + 等值谓词 (PK/UK),返回 ≤ 1 行无需否1
INDEX RANGE SCAN范围谓词 (>, <, BETWEEN, LIKE) 或非唯一索引等值按索引顺序否视范围
INDEX FULL SCANCBO 判定全索引扫描优于全表,且需有序输出有序否中等
INDEX FAST FULL SCAN仅需索引列数据,不要求顺序,CBO 启用无序✅ 支持低

实战执行计划解读

1. 唯一扫描 + 回表

SELECT EMPNO, ENAME FROM EMP WHERE EMPNO = 10;
-- TABLE ACCESS BY ROWID EMP
--   INDEX UNIQUE SCAN EMP_I1

2. 仅扫描索引 (覆盖索引)

SELECT EMPNO FROM EMP WHERE EMPNO = 10;
-- INDEX UNIQUE SCAN EMP_I1   (无 TABLE ACCESS)

3. 范围扫描 + ORDER BY 免排序

SELECT EMPNO, ENAME FROM EMP WHERE EMPNO > 7876 ORDER BY EMPNO;
-- TABLE ACCESS BY ROWID EMP
--   INDEX RANGE SCAN EMP_I1   (已有序,省 SORT ORDER BY)

性能决策要点

  • 回表比例 > 5%-10% 时,考虑 FTS 或建立覆盖索引 (包含 SELECT 列)。
  • 复合索引遵循最左前缀原则:WHERE 必须包含前导列才能使用。
  • INDEX FAST FULL SCAN 适合 COUNT(*)、全列聚合等不需顺序场景,可并行。

常见误区

「有索引就一定快」——错!索引维护成本 (DML 开销、空间、碎片) 与查询收益须权衡;低选择性索引反而拖慢写入且优化器可能忽略。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved