首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> Oracle 資料庫 >> Oracle 資料庫基礎

Oracle 低基數欄位(如性別)索引策略:Bitmap 索引實戰

     編輯:Oracle 資料庫基礎

gender、status、is_deleted 等低基數欄位(Distinct Values < 1% 行數),建立 B-Tree 索引幾無效果,優化器傾向全表掃描。Bitmap 索引專為此類場景設計。

Bitmap 索引特性

  • 每個 Distinct Value 對應一個位圖,位元 1 代表該行擁有該值。
  • 儲存極度緊湊,多條件 AND/OR 可直接位元運算(BITMAP AND/OR),無需轉 Rowid。
  • 適用唯讀/低 DML環境(資料倉庫、DSS、報表表),高併發 DML 會造成嚴重鎖爭用(鎖定整個位圖段)。

建立範例

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%:

  • 無索引 / B-Tree:全表掃描 ~3.2 秒。
  • Bitmap 索引:位圖轉 Rowid ~0.4 秒(提升 8 倍)。

注意事項

  • 嚴禁用於高併發 OLTP 核心表(INSERT/UPDATE/DELETE 會鎖定大量位圖片段)。
  • 可結合 BITMAP JOIN INDEX 在事實表直接建立維度欄位索引,避免 Join。
  • 11g+ 支援 BITMAP INDEX ON (col) LOCAL 分區位圖索引。
低基數欄位用 Bitmap 索引,高基數用 B-Tree,混合查詢用 Bitmap Join Index,根據負載特性選型才是正道。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved