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

Oracle 索引扫描四大类型全解析:唯一、范围、全、快速全

     編輯:Oracle 資料庫基礎

分类依据:索引类型 + WHERE 谓词

1. 索引唯一扫描 (INDEX UNIQUE SCAN)

  • 前提:唯一索引 (PK/UK) 或复合唯一索引包含前导列。
  • 谓词:等值 (=) 且保证返回 ≤ 1 行。
  • 示例:WHERE EMPNO = 10 (EMPNO 为 PK)。
  • 执行计划:INDEX UNIQUE SCAN → TABLE ACCESS BY ROWID。

2. 索引范围扫描 (INDEX RANGE SCAN)

  • 三种触发场景:
    (a) 唯一索引 + 范围谓词 (>, <, >=, <=, BETWEEN, <>)
    (b) 复合索引仅用前导列部分列查询,返回多行
    (c) 非唯一索引任何查询 (等值也可能多行)
  • 示例:WHERE EMPNO > 7876 ORDER BY EMPNO。
  • 执行计划:INDEX RANGE SCAN (已有序,省排序)。

3. 索引全扫描 (INDEX FULL SCAN)

  • 仅 CBO 模式生效。
  • 条件:统计信息显示全索引扫描成本 < 全表扫描,且查询列全在索引中 (无需回表),需有序输出。
  • 示例:组合索引 BE_IX(EMPNO, ENAME),SELECT EMPNO, ENAME FROM BIG_EMP ORDER BY EMPNO, ENAME。
  • 单块读,不支持多块读,大索引时效率可能低于 FTS。

4. 索引快速全扫描 (INDEX FAST FULL SCAN)

  • 扫描索引所有块,不保证顺序,支持多块读与并行。
  • 适用:仅需索引列数据,不要求排序 (如 SELECT EMPNO, ENAME FROM BIG_EMP 或 COUNT(*))。
  • 吞吐最大化,Cost 通常极低。

对比速查表

特性UNIQUE SCANRANGE SCANFULL SCANFAST FULL SCAN
访问路径B-Tree 单路径B-Tree 范围叶块链表顺序段头全块扫描
排序输出单行无序按索引序按索引序无序
多块读否否否是
并行支持否否否是
回表视 SELECT 列视 SELECT 列无 (仅索引列)无 (仅索引列)

优化器选择建议

  • 收集完整统计信息 (DBMS_STATS.GATHER_TABLE_STATS),CBO 才会考虑 FULL/FAST FULL SCAN。
  • 大表聚合查询显式 Hint:/*+ INDEX_FFS(T IDX) */ 强制快速全扫描。
  • 监控 V$SEGMENT_STATISTICS 中 logical reads 与 physical reads 比例,评估索引扫描效率。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved