| 模式 | 參數值 | 特性 | 適用場景 |
|---|---|---|---|
| RULE (RBO) | OPTIMIZER_MODE=RULE | 基於固定規則 (啟發式),不參考統計資訊 | 舊系統相容、統計資訊不可靠時 |
| COST (CBO) | OPTIMIZER_MODE=COST / ALL_ROWS / FIRST_ROWS | 基於成本模型,參考物件統計資訊 | 現代系統標準、需定期收集統計 |
| CHOOSE | OPTIMIZER_MODE=CHOOSE (預設) | 有統計用 CBO,無統計用 RBO | 不推薦,行為不可預測 |
-- 實例層級 (init.ora / spfile)
OPTIMIZER_MODE = ALL_ROWS -- 全表最佳吞吐量 (批次/報表)
OPTIMIZER_MODE = FIRST_ROWS_10 -- 前 10 行最快回應 (OLTP/Web)
-- Session 層級
ALTER SESSION SET OPTIMIZER_MODE = FIRST_ROWS;
-- SQL 層級 Hint
SELECT /*+ FIRST_ROWS(10) */ * FROM emp WHERE deptno = 10;
SELECT /*+ ALL_ROWS */ * FROM large_table;
-- 收集表/索引/欄位統計 (10g+ 推薦 DBMS_STATS)
EXEC DBMS_STATS.GATHER_TABLE_STATS('SCOTT', 'EMP', CASCADE=>TRUE, METHOD_OPT=>'FOR ALL COLUMNS SIZE AUTO');
-- 10g+ 自動統計收集作業 (預設啟用,維護窗口執行)
-- 檢查:SELECT * FROM DBA_AUTOTASK_CLIENT WHERE CLIENT_NAME = 'auto optimizer stats collection';
關鍵統計項目: 表區塊數、列數、平均列長、欄位 NDV (不重複值數)、直方圖、索引層級/葉區塊/聚簇因子。
| 路徑 | 機制 | 觸發條件 | 效能特徵 |
|---|---|---|---|
| 全表掃描 (FTS) | 多區塊讀取 (db_file_multiblock_read_count),掃描 High Water Mark 以下所有區塊 | 無索引、索引選擇性低 (>5-10%)、小表、並行查詢 | 序列 I/O 效率高,但讀取大量非必要區塊 |
| 索引掃描 → ROWID 存取 | 1. 索引範圍掃描取得 ROWID 2. 由 ROWID 定位表區塊 (單區塊讀取) | 高選擇性索引、唯一鍵查詢、範圍查詢 | 隨機 I/O 多,適用少量資料回傳 |
(索引鍵值, ROWID) 配對,提供「值 → 物理位置」映射。ALL_ROWS 或 FIRST_ROWS_n。/*+ INDEX(t idx_name) */、/*+ FULL(t) */ (測試用)。EXPLAIN PLAN、DBMS_XPLAN.DISPLAY_CURSOR、AWR/ASH 報表。