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

Oracle 索引掃描四大類型詳解:Unique/Range/Full/Fast Full Scan 執行計畫識別

     編輯:Oracle 資料庫基礎

Oracle 優化器根據索引類型與 WHERE 條件,選擇四種索引掃描方式。理解其觸發條件與執行計畫關鍵字,是 SQL 調優的核心基本功。本文以 EMP 表為例,逐一解析 INDEX UNIQUE SCAN、INDEX RANGE SCAN、INDEX FULL SCAN、INDEX FAST FULL SCAN。

前置:測試環境

CREATE TABLE emp (empno NUMBER PRIMARY KEY, ename VARCHAR2(20), deptno NUMBER);
CREATE INDEX emp_i1 ON emp(empno);  -- PK 自動建立唯一索引
CREATE INDEX be_ix ON big_emp(empno, ename);  -- 組合索引

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

觸發條件

  • **唯一索引** (PK/UK)
  • WHERE 條件為 **等值 (=)** 且 **包含導引欄位**
  • 預期回傳 **0 或 1 筆**

範例

EXPLAIN PLAN FOR SELECT empno, ename FROM emp WHERE empno = 10;
-- Plan:
-- TABLE ACCESS BY ROWID EMP
--   INDEX UNIQUE SCAN EMP_I1

組合索引注意

索引 (ename, deptno, loc),查詢 WHERE ename='JACK' AND deptno='DEV' 可用 Unique Scan;WHERE deptno='DEV' **無導引欄位 ename**,無法使用此索引。

2. INDEX RANGE SCAN (索引範圍掃描)

觸發條件(任一即可)

  1. 唯一索引上使用 **範圍運算子** (>, <, >=, <=, BETWEEN, <>)
  2. 組合索引**僅用部分導引欄位**,導致可能回傳多筆
  3. **非唯一索引** 上的任何查詢(因可能回傳多筆)

範例

EXPLAIN PLAN FOR SELECT empno, ename FROM emp WHERE empno > 7876 ORDER BY empno;
-- Plan:
-- TABLE ACCESS BY ROWID EMP
--   INDEX RANGE SCAN EMP_I1

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

觸發條件

  • **CBO 模式** (Cost-Based Optimizer)
  • 查詢欄位**全在索引中** (Index-only access),無需回表
  • 優化器判斷全掃描索引比全表掃描更划算(通常索引較小、需排序)
  • 常見於 ORDER BY 符合索引順序時避免排序

範例

EXPLAIN PLAN FOR SELECT empno, ename FROM big_emp ORDER BY empno, ename;
-- Plan:
-- INDEX FULL SCAN BE_IX  -- 已排序,無 SORT ORDER BY

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

與 Full Scan 差異

特性INDEX FULL SCANINDEX FAST FULL SCAN
順序按索引鍵順序讀取 (單塊 I/O)**不保證順序** (多塊 I/O,如 Full Table Scan)
排序結果已排序結果**未排序**
平行不支援平行支援 **Parallel Query**
用途需有序結果、避免排序純計數、全欄位在索引、大表掃描

範例

EXPLAIN PLAN FOR SELECT empno, ename FROM big_emp;
-- Plan:
-- INDEX FAST FULL SCAN BE_IX  -- 多塊讀、平行、無序

EXPLAIN PLAN FOR SELECT ename FROM big_emp;
-- Plan:
-- INDEX FAST FULL SCAN BE_IX  -- 僅需 ename,索引覆蓋

四類掃描快速辨識表

掃描類型索引類型WHERE 條件回傳行數關鍵字
UNIQUE SCANUnique= (含導引欄)0/1INDEX UNIQUE SCAN
RANGE SCANUnique/Non-Unique範圍/部分導引/非唯一>=0INDEX RANGE SCAN
FULL SCAN任何無/全欄位在索引+ORDER BY所有INDEX FULL SCAN
FAST FULL SCAN任何無/全欄位在索引所有INDEX FAST FULL SCAN

調優實務建議

  • 查詢只需索引欄位 → 考慮 **Covering Index** (包含所有 SELECT 欄位) 觸發 Fast Full Scan。
  • 需排序且符合索引順序 → Full Scan 避免 Sort。
  • 大表點查 → 確保 PK/UK 存在,觸發 Unique Scan。
  • 執行計畫出現 TABLE ACCESS FULL 但表有索引 → 檢查統計資訊、隱性轉換、函數索引缺失。

熟記四大掃描觸發條件與 Plan 關鍵字,閱讀執行計畫時即能瞬間判斷索引是否被正確使用,快速定位調優方向。

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