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

Oracle 索引優缺點全面剖析:五大收益、四大代價與建立策略指南

     編輯:Oracle 資料庫基礎

索引類型速覽

  • B-Tree 索引:預設、最通用、支援範圍/排序/連接。
  • 位圖索引:低基數欄位(性別、狀態)、數倉星型查詢、不適合高併發 OLTP。
  • 函數索引:索引 `UPPER(name)` 等運算式,解決函數導致索引失效。
  • 反向鍵索引:反轉鍵值分散插入熱點,適合序號主鍵高併發插入。
  • 索引組織表 (IOT):資料即索引,主鍵存取極快,次要索引維護複雜。

五大核心收益

  1. 強制唯一性:唯一索引/主鍵約束,保證業務鍵不重複。
  2. 大幅加速檢索:全表掃描 → 索引範圍掃描,**數量級效能提升**,是建立索引首要理由。
  3. 加速表連接:外鍵欄位建索引,Nested Loop Join 驅動表高效存取內表,**參考完整性檢查也受益**。
  4. 優化排序/分組:索引天然有序,`ORDER BY`、`GROUP BY` 可直接讀取索引避免排序操作。
  5. 輔助優化器決策:索引統計資訊(聚簇因子、唯一值數、直方圖)讓 CBO 更精準估算成本。

四大代價與風險

  1. 建立/維護耗時:建立索引掃描全表排序;DML 時同步維護 B-Tree,**寫入效能下降**。
  2. 佔用物理空間:索引段獨立佔用表空間,**聚簇索引/IOT 空間更大**。
  3. 降低維護速度:每次 INSERT/UPDATE/DELETE 觸發索引維護,**批量載入時建議先 DISABLE INDEX → 載入 → REBUILD**。
  4. 優化器誤判風險:統計資訊過期/缺失導致選錯索引,反而劣化效能。

為什麼不給每個欄位建索引?

**邊際效益遞減 + 邊際成本遞增。** 索引是「精準手術刀」,非「廣譜抗生素」。

應建立索引的欄位特徵(高收益場景)

  • 頻繁出現在 `WHERE` 條件欄位(選擇性高 > 1-5%)
  • 主鍵/唯一鍵欄位(強制約束)
  • 頻繁用於 `JOIN ON` 的外鍵欄位
  • 頻繁用於 `ORDER BY`/`GROUP BY` 的欄位
  • 範圍查詢欄位(`BETWEEN`、`>`、`<`、`LIKE 'prefix%'`)

不應建立索引的欄位特徵(低收益/負收益場景)

特徵理由典型案例
查詢極少引用維護成本 > 查詢收益備註欄、擴充屬性
基數極低索引選擇性差,優化器傾向全表掃描性別、狀態碼(0/1/2)、是否刪除旗標
大物件型別索引結構不支援/極大CLOB、BLOB、BFILE、LONG
高頻異動、低頻查詢寫入代價遠超讀取收益日誌表序號、臨時狀態欄位

索引策略黃金法則

  1. 以業務查詢模式為導向,而非表結構。分析 Top SQL、執行計畫、AWR/ASH 報告。
  2. 複合索引遵循「最左前綴」與「選擇性遞減」原則。 `INDEX (a,b,c)` 支援 `a`、`a,b`、`a,b,c`,不支援 `b`、`b,c`。
  3. 定期監控索引使用情況: `V$OBJECT_USAGE` (監控模式)、`DBA_HIST_SQL_PLAN`、AWR 索引掃描統計。**長期未用索引果斷 DROP**。
  4. 批量載入/重構時: `ALTER INDEX ... UNUSABLE` → 載入 → `REBUILD ONLINE`,避免大量 Redo/Undo。
  5. 12c+ 新特性: 部分索引、自動索引(Autonomous DB)、索引壓縮進階選項。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved