索引如字典目錄,能讓資料庫快速定位資料而非全表掃描。但索引非越多越好,維護成本(DML 時同步更新)與查詢效能需取得平衡。本文詳細比較 B-Tree 與 Bitmap 索引適用場景、基數概念、複合條件優勢、NULL 值處理,並提供選擇決策樹。
核心概念:基數
基數 = 欄位不重複值的數量。
範例:gender (M/F) 基數=2;marital_status (單/已婚/離) 基數=3;id_card_no 基數≈資料列數(高基數)。
B-Tree 索引(標準索引)
- 結構:平衡樹,儲存排序後的鍵值 + ROWID。
- 適用:高基數 欄位(PK、UK、流水號、時間戳)。
- 特點:範圍掃描、排序、唯一性約束支援完善。
- 缺點:低基數欄位建立 B-Tree,單一鍵值對應大量 ROWID,掃描成本高。
Bitmap 索引
- 結構:對每個不重複值建立一個位圖,位元 1 代表該列擁有該值。
- 適用:低基數 欄位(性別、狀態碼、類別、地區)。
- 優勢:
- 位圖可直接進行
AND/OR 位元運算,多條件組合極快。
- 支援
IS NULL 查詢(B-Tree 預設不索引 NULL)。
- 儲存空間極小(低基數時)。
- 缺點:
- DML 並發嚴重鎖定(位圖片段鎖定範圍大),不適合高併發 OLTP 寫入。
- 範圍條件(
>、<、!=)無優勢,仍建議 B-Tree。
三大適用場景決策樹
- 基數低 + 需頻繁查詢 → Bitmap(如「已婚女性」
gender='F' AND marital='Y')。
- WHERE 條件多重 AND/OR 組合 → Bitmap(位圖合併運算)。
- 需查詢 NULL 值 → Bitmap(唯一能高效處理
WHERE col IS NULL 的索引)。
其他情況(高基數、範圍查詢、高併發寫入、排序需求)優先選 B-Tree。
實戰建議
- 資料倉庫/OLAP 環境:大量低基數維度欄位 → 多用 Bitmap,配合 Star Transformation。
- OLTP 核心交易表:寫入頻繁 → 嚴格限制索引數量,優先 B-Tree,Bitmap 僅用於極少更新的旗標欄位。
- 複合索引:將「最常用於等值過濾的高基數欄位」放前面,低基數旗標放後面(或改用 Bitmap)。
- 監控:定期查詢
V$SEGMENT_STATISTICS 或 USER_INDEXES 的 BLEVEL、LEAF_BLOCKS,評估索引健康度。
「寧缺勿濫」是索引設計鐵律。依據基數、查詢模式、寫入頻率三維度決策,才能在查詢加速與維護成本間找到最佳平衡點。