位圖索引 (Bitmap Index) 以位圖儲存每個唯一值對應的 Rowid 集合,極度壓縮、適合低基數欄位。與 B-tree 索引互補,是資料倉庫、OLAP 環境核心索引類型。
| 特性 | B-tree 索引 | 位圖索引 |
|---|---|---|
| 適用基數 | 高基數 (唯一值多) | 低基數 (唯一值少,通常 < 1% 行數) |
| 儲存結構 | 樹狀結構,儲存 (Key, Rowid) | 位圖矩陣,每值一個位圖 |
| 壓縮效率 | 低 | 極高 (Run-Length Encoding) |
| DML 開銷 | 低 (單行鎖) | 高 (區塊級鎖,嚴重阻塞並發) |
| 查詢優勢 | 單值/範圍查找 | 多值 OR/AND 邏輯運算 (位運算極快) |
| 空值處理 | 不索引全 NULL | 索引 NULL 值 (可查 IS NULL) |
time_id, product_id, region_id)-- 單欄位位圖索引 CREATE BITMAP INDEX sales_time_bmx ON sales (time_id); CREATE BITMAP INDEX sales_cust_bmx ON sales (cust_id); CREATE BITMAP INDEX sales_prod_bmx ON sales (prod_id); CREATE BITMAP INDEX sales_channel_bmx ON sales (channel_id); CREATE BITMAP INDEX sales_promo_bmx ON sales (promo_id); -- 組合位圖索引 (多欄位 AND 查詢優化) CREATE BITMAP INDEX sales_time_cust_bmx ON sales (time_id, cust_id);
優化器將多個位圖索引透過位運算 (AND/OR/NOT) 合併,快速產生結果 Rowid 集合。
-- 重建單一索引
ALTER INDEX sales_time_bmx REBUILD [PARALLEL 4];
-- 重建表上所有位圖索引
EXEC DBMS_STATS.GATHER_TABLE_STATS('SH', 'SALES', cascade=>TRUE);
ALTER INDEX sales_time_bmx MONITORING USAGE; -- 一段時間後 SELECT index_name, used FROM v$object_usage WHERE index_name = 'SALES_TIME_BMX'; ALTER INDEX sales_time_bmx NOMONITORING USAGE;
預先計算維度表與事實表的聯結關係,加速星型查詢。