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

Oracle 索引深度解析:B-tree、位圖、分區、壓縮、函數基、反轉鍵等七大類型全攻略

     編輯:Oracle 教學

Oracle 索引深度解析:七大類型全攻略

索引是 Oracle 效能調校的核心利器。本文系統整理七種常見索引類型的架構特性、適用場景、建立語法與避坑指南,助你精準選型。

1. B-tree 索引(預設類型)

  • 結構:平衡樹,根節點 → 分支節點 → 葉節點(含 ROWID),高度通常 2-3 層。
  • 特性:適合高基數欄位、OLTP 系統頻繁 DML;不索引全 NULL 的單欄列;組合索引中只要非全 NULL 即會被索引。
  • 右側增長問題:遞增鍵值(如序列、SYS_GUID)導致熱點集中在最右葉塊,引發 buffer busy waits。
  • 解決方案:反轉鍵索引、雜湊分區索引、增加 CACHE 大小的序列。

2. 位圖索引

  • 適用:低基數欄位(性別、狀態碼)、資料倉庫/決策支援系統(DSS)、唯讀或批次載入環境。
  • 機制:每個 distinct value 對應一個位圖,位元標示 row 存在與否;多位圖可高效 AND/OR 合併。
  • 限制:DML 成本極高(鎖定整個值範圍的 ROWID)、不支援 UNIQUE、Rule-based Optimizer 忽略、ALTER TABLE MODIFY 會失效。

3. 分區索引

3.1 本地分區索引

  • 與表分區一對一對應,LOCAL 關鍵字;支援 B-tree 與位圖;分區維護(ADD/DROP/TRUNCATE/SPLIT)自動同步,無需重建。
  • 前綴索引:索引鍵包含分區鍵前導欄 → 優化器可做 Partition Pruning。
  • 非前綴索引:索引鍵不含分區鍵前導欄;唯一性約束需包含分區鍵子集。

3.2 全域分區索引

  • 單一索引橫跨多個表分區,僅支援 B-tree;GLOBAL 關鍵字;預設為前綴索引;分區維護後預設 UNUSABLE,需 UPDATE GLOBAL INDEXES 子句或手動重建。

4. 壓縮索引

CREATE INDEX idx_comp ON t(c1, c2, c3) COMPRESS 2;
  • 壓縮前導欄(此例 c1、c2),適合前導欄重複度高的組合索引;節省空間、減少 I/O、降低樹高度。
  • 不適用於高基數前導欄;DML 時需維護壓縮結構,略增 CPU。

5. 函數基索引

CREATE INDEX idx_upper_job ON emp(UPPER(job));
  • 針對運算式結果建立索引;查詢時必須使用完全相同運算式(WHERE UPPER(job)='MGR')才能命中。
  • 需設定 QUERY_REWRITE_ENABLED=TRUE;統計資訊需同步收集(DBMS_STATS.GATHER_TABLE_STATS)。

6. 反轉鍵索引

CREATE INDEX idx_rev ON t(id) REVERSE;
  • 將鍵值位元組順序反轉(1234 → 4321),分散插入熱點;解決右側增長問題。
  • 副作用:無法進行範圍掃描(>、<、BETWEEN)、不支援位圖索引與 IOT。

7. 索引組織表

  • 表資料即以 B-tree 結構按主鍵儲存,省去 ROWID 查找;適合主鍵存取為主的查詢模式。
  • 需建立次要索引支援非主鍵查詢;次要索引儲存 PK + 猜測 ROWID。

選型決策樹

  1. OLTP 高併發 DML + 高基數 → B-tree(預設)。
  2. DSS/倉庫 + 低基數 + 複雜邏輯 → 位圖。
  3. 大表 + 範圍查詢 + 分區表 → 本地分區 B-tree。
  4. 遞增鍵熱點 → 反轉鍵 或 雜湊分區索引。
  5. 前導欄重複度高 → 壓縮索引。
  6. 查詢含函數運算 → 函數基索引。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved