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); -- 組合索引
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**,無法使用此索引。
>, <, >=, <=, BETWEEN, <>)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
ORDER BY 符合索引順序時避免排序EXPLAIN PLAN FOR SELECT empno, ename FROM big_emp ORDER BY empno, ename;
-- Plan:
-- INDEX FULL SCAN BE_IX -- 已排序,無 SORT ORDER BY
| 特性 | INDEX FULL SCAN | INDEX 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 SCAN | Unique | = (含導引欄) | 0/1 | INDEX UNIQUE SCAN |
| RANGE SCAN | Unique/Non-Unique | 範圍/部分導引/非唯一 | >=0 | INDEX RANGE SCAN |
| FULL SCAN | 任何 | 無/全欄位在索引+ORDER BY | 所有 | INDEX FULL SCAN |
| FAST FULL SCAN | 任何 | 無/全欄位在索引 | 所有 | INDEX FAST FULL SCAN |
TABLE ACCESS FULL 但表有索引 → 檢查統計資訊、隱性轉換、函數索引缺失。熟記四大掃描觸發條件與 Plan 關鍵字,閱讀執行計畫時即能瞬間判斷索引是否被正確使用,快速定位調優方向。