前言
Oracle 索引種類繁多,依分類維度不同可歸納為邏輯、物理與結構三大面向。理解分類有助於依據業務場景選擇正確索引類型。
一、邏輯分類 (功能語意)
| 類型 | 說明 | 典型用途 |
| Single Column (單欄) | 單一欄位建立 | 簡單過濾條件 |
| Concatenated / Composite (組合/複合) | 多欄位,順序敏感 | 多條件查詢、遵循最左前綴 |
| Unique (唯一) | 強制唯一性 (含單一 NULL) | PK、UK、業務鍵 |
| Non-Unique (非唯一) | 允許重複值 | 一般查詢加速 |
| Function-Based (函數式) | 對運算式結果索引 | WHERE UPPER(name)='X'、WHERE salary*12 > 100000 |
| Domain (域索引) | 擴充索引類型 (Text、Spatial、XML) | 全文檢索、空間查詢、XML 路徑 |
二、物理分類 (儲存架構)
| 類型 | 說明 |
| Partitioned (分區索引) | Global 或 Local 分區,對應分區表,便於維護與裁剪 |
| Non-Partitioned (非分區) | 傳統單一段索引 |
三、結構分類 (資料結構與適用場景) — 核心決策依據
1. B-tree 索引 (預設、最通用)
- Normal:標準平衡樹,高度通常 2~3 層,葉節點雙向鏈表。
- Reverse Key:鍵值位元組反轉,解決遞增主鍵右側熱點爭用。
- 適用:高基數、OLTP、精確查詢、範圍查詢、ORDER BY、JOIN 驅動。
- 不適用:OR 條件 (無法合併多個索引掃描)、低基數、全表掃描更快時。
2. Bitmap 索引 (位圖索引)
- 結構:每個 distinct value 對應一個位圖,bit 位映射 ROWID 範圍。
- 適用:低基數 (性別、狀態)、資料倉庫、複雜 AND/OR 多條件過濾、星狀查詢。
- 不適用:高併發 DML (鎖定整個位圖片段、死鎖風險高)、OLTP 核心表。
- 操作:位圖合併 (BITMAP AND/OR) 極快,但 UPDATE 需鎖定大量 bit。
選擇決策樹
- 是否為全文/空間/XML? → Domain Index (CTXSYS.CONTEXT, MDSYS.SPATIAL_INDEX)
- 欄位基數極低 (< 50) 且唯讀/批次載入? → Bitmap Index
- 需支援函數/運算式查詢? → Function-Based B-tree
- 遞增序列主鍵高併發 INSERT? → Reverse Key B-tree
- 一般 OLTP 精確/範圍查詢? → Normal B-tree (單欄或組合)
- 大表分區? → Local Partitioned Index (對齊分區裁剪)
補充:索引結構細節
- B-tree 葉節點儲存 **(鍵值, ROWID)**,依鍵值排序,支援範圍掃描。
- Bitmap 索引頭儲存 **(起始 ROWID, 結束 ROWID, 位圖資料)**,每 bit 對應一行。
- 索引高度 (BLEVEL) 可透過
USER_INDEXES 查詢,BLEVEL ≥ 3 考慮重建或增加區塊大小。