Oracle 9i 強化 Fast Full Index Scan (FFS):直接多區塊讀取索引區塊(類似全表掃描),不走 B-Tree 導航,不需訪問表。適用於:查詢欄位全包含於索引、需掃描大量行 (10%~25%)、不需排序。
OPTIMIZER_MODE != RULE。db_file_multiblock_read_count、optimizer_index_cost_adj、並行度影響)。
-- 學生表
CREATE TABLE student (
student_name VARCHAR2(40),
date_of_birth DATE
);
-- 函數索引:大寫首字母 + 日期格式化
CREATE INDEX idx_student_fn ON student (
INITCAP(student_name),
TO_CHAR(date_of_birth, 'MM-DD-YY')
);
-- 觸發 FFS 的查詢 (完全匹配索引表達式)
SELECT * FROM student WHERE INITCAP(student_name) = 'Jones';
SELECT * FROM student WHERE TO_CHAR(date_of_birth, 'MM-DD-YY') = '04-07-85';
-- 強制 FFS + 並行
SELECT /*+ INDEX_FFS(s idx_student_fn) PARALLEL_INDEX(s idx_student_fn 4) */
COUNT(*) FROM student s;
| 參數 | 影響 | 調大效果 |
|---|---|---|
| db_file_multiblock_read_count | 單次 I/O 讀取區塊數 | FFS 成本降低,更傾向選擇 FFS |
| optimizer_index_cost_adj | 索引存取成本調整百分比 | 值越小 (如 10) 越傾向索引/FFS |
| 索引並行度 | ALTER INDEX ... PARALLEL n | 並行 FFS 大幅縮短響應時間 |
| 直方圖統計 | 偏態資料分布估算 | 準確估算回傳行數,避免誤選 FFS |
-- 僅強制 FFS
SELECT /*+ INDEX_FFS(t idx_name) */ col FROM t WHERE ...;
-- FFS + 並行索引掃描
SELECT /*+ INDEX_FFS(t idx_name) PARALLEL_INDEX(t idx_name 8) */ col FROM t WHERE ...;
-- 指定並行查詢 (表級)
SELECT /*+ PARALLEL(t 8) INDEX_FFS(t idx_name) */ col FROM t WHERE ...;
DBMS_STATS.GATHER_TABLE_STATS(..., METHOD_OPT=>'FOR ALL COLUMNS SIZE AUTO'),讓 CBO 自主決策。SET TIMING ON、AUTOTRACE,對比 FFS 與 INDEX RANGE SCAN 實際耗時。SQL Plan Baseline 固定優良計畫。大量既有系統升級 9i 後,符合條件的查詢自動轉用 FFS,無需改碼。但需檢查 OPTIMIZER_INDEX_COST_ADJ 預設 100 是否適合新環境,建議設為 20~50 針對 OLTP。