gender、status、is_deleted 等低基數欄位(Distinct Values < 1% 行數),建立 B-Tree 索引幾無效果,優化器傾向全表掃描。Bitmap 索引專為此類場景設計。
AND/OR 可直接位元運算(BITMAP AND/OR),無需轉 Rowid。CREATE BITMAP INDEX idx_emp_gender ON emp (gender);
CREATE BITMAP INDEX idx_emp_dept_status ON emp (dept_id, status); -- 複合位圖索引
-- B-Tree 索引:FULL TABLE SCAN
SELECT * FROM emp WHERE gender = 'M';
-- Bitmap 索引:BITMAP CONVERSION TO ROWIDS -> INDEX RANGE SCAN
SELECT * FROM emp WHERE gender = 'M' AND status = 'ACTIVE';
百萬筆員工表,gender='M' 佔 52%:
BITMAP JOIN INDEX 在事實表直接建立維度欄位索引,避免 Join。BITMAP INDEX ON (col) LOCAL 分區位圖索引。低基數欄位用 Bitmap 索引,高基數用 B-Tree,混合查詢用 Bitmap Join Index,根據負載特性選型才是正道。