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

Oracle 位圖索引:適用場景、建立與維護實務指南

     編輯:Oracle 教學

位圖索引核心特性

位圖索引 (Bitmap Index) 以位圖儲存每個唯一值對應的 Rowid 集合,極度壓縮、適合低基數欄位。與 B-tree 索引互補,是資料倉庫、OLAP 環境核心索引類型。

B-tree vs 位圖索引對比

特性B-tree 索引位圖索引
適用基數高基數 (唯一值多)低基數 (唯一值少,通常 < 1% 行數)
儲存結構樹狀結構,儲存 (Key, Rowid)位圖矩陣,每值一個位圖
壓縮效率低極高 (Run-Length Encoding)
DML 開銷低 (單行鎖)高 (區塊級鎖,嚴重阻塞並發)
查詢優勢單值/範圍查找多值 OR/AND 邏輯運算 (位運算極快)
空值處理不索引全 NULL索引 NULL 值 (可查 IS NULL)

適用場景判斷清單

  • ✅ 資料倉庫、決策支援系統 (DSS)、OLAP
  • ✅ 維度表外鍵欄位 (如 time_id, product_id, region_id)
  • ✅ 旗標/狀態/類別欄位 (性別 Y/N, 狀態 0/1/2, 等級 A/B/C/D)
  • ✅ 唯一值 < 表行數 1% (經驗值)
  • ✅ 複雜 WHERE 子句多條件組合 (AND/OR)
  • ❌ OLTP 高並發寫入環境
  • ❌ 高基數欄位 (如 ID、流水號、時間戳)
  • ❌ 頻繁 UPDATE/DELETE 的表

建立位圖索引語法

-- 單欄位位圖索引
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);

3. 統計資訊收集

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;

進階應用:位圖聯結索引

預先計算維度表與事實表的聯結關係,加速星型查詢。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved