索引雙面刃:查詢快、寫入慢。盲目建立索引反而拖垮整體效能。本文彙整 7 項 DBA 實戰經驗,助你在「查詢加速」與「維護成本」間取得平衡。
資料量極少 (如 < 1,000 筆、區塊數 < 50) 時,全表掃描 I/O 成本極低,優化器通常直接忽略索引。
經驗值:若查詢回傳資料 > **10%~15%** 總筆數,全表掃描通常比索引範圍掃描 + TABLE ACCESS BY ROWID 更快。精確門檻需透過 EXPLAIN PLAN 驗證。
WHERE col IS NOT NULL 可大幅加速。ALTER INDEX idx REBUILD ONLINE;V$OBJECT_USAGE 需先 ALTER INDEX idx MONITORING USAGE) 的索引應刪除。DBMS_STATS.GATHER_INDEX_STATS 保持優化器決策準確。每新增一個索引,INSERT/UPDATE/DELETE 皆需額外維護索引項目。**OLTP 核心表建議 ≤ 5 個索引**;唯讀/資料倉庫表可放寬。
| 場景 | 索引策略 |
|---|---|
| 資料倉庫 / 唯讀 / 批次載入 | 大量位圖索引、函數式索引、分區索引;載入前 UNUSABLE 索引,載入後 REBUILD。 |
| OLTP / 高併發交易 | 精簡 B-tree 索引,避免位圖索引;關鍵 FK、高選擇性欄位;監控鎖爭用。 |
位圖索引適用於**極低基數** (如性別 2、婚姻 3、地區 < 50)。若基數 > 100,位圖索引體積膨脹、合併運算慢,反而不如 B-tree。切勿對「類別代碼」這類中等基數欄位濫用位圖索引。
「小表免索、低選免索、高選必索、常維護、數量可控、場景分策、位圖看基」