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

Oracle 索引實戰指南:建立策略、分區索引、聚簇替代與表索引分離存儲

     編輯:Oracle 資料庫基礎

索引:查詢效能的加速器,也是維護成本的來源

索引透過 B*Tree 將邏輯值映射至 ROWID,實現 O(log n) 存取。但索引非越多越好——寫入開銷、空間佔用、優化器誤判風險並存。本文提供索引建立決策框架、大表分區索引策略、聚簇替代方案、表索引物理隔離最佳實踐。

索引建立核心決策矩陣

條件動作理由
欄位出現在 WHERE/JOIN/ORDER BY/GROUP BY候選建立索引存取路徑最短化
選擇性 < 1-2% (高選擇性)強烈建議 B*Tree 索引索引掃描成本遠低於 FTS
選擇性 > 5-10% (低選擇性)通常不建立,或考慮位圖索引 (DW)FTS 多區塊讀取更高效
欄位頻繁 UPDATE/DELETE謹慎建立,評估 DML 開銷索引維護產生 Redo/Undo、分裂/合併
複合索引導引欄位未在條件中不建立或調整欄位順序無法利用索引範圍掃描
隱性型別轉換風險 (數字比較字串)修正應用/加入函數索引導致索引失效、FTS

大表索引特殊挑戰與分區索引方案

問題:大表索引佔用大量 Buffer Cache (索引塊優先級高),擠佔資料塊,導致頻繁物理讀、效能抖動。

方案:Local Partitioned Index (本地分區索引)

  • 索引分區與表分區一一對應,等分區對齊
  • 分區維護 (TRUNCATE/DROP/EXCHANGE) 自動同步索引,無需 REBUILD
  • 分區修剪同時作用於表與索引,雙重過濾
  • Global Index 僅在跨分區唯一性約束、全域排序需求時使用

聚簇:多表共儲的替代連接方案

-- 建立索引聚簇
CREATE CLUSTER emp_dept_cluster (deptno NUMBER(2))
SIZE 1024  -- 預估每鍵值資料大小
INDEX;

CREATE INDEX idx_emp_dept_cluster ON CLUSTER emp_dept_cluster;

CREATE TABLE dept_clustered (
  deptno NUMBER(2) PRIMARY KEY,
  dname  VARCHAR2(14)
) CLUSTER emp_dept_cluster (deptno);

CREATE TABLE emp_clustered (
  empno  NUMBER(4) PRIMARY KEY,
  ename  VARCHAR2(10),
  deptno NUMBER(2) REFERENCES dept_clustered(deptno)
) CLUSTER emp_dept_cluster (deptno);

表與索引物理隔離存儲:消除 I/O 爭用

原理:表資料 I/O (順序/隨機) 與索引 I/O (隨機) 混雜同一磁碟 → 磁頭頻繁跳動、佇列擁塞。

實施:

-- 邏輯分離
CREATE TABLESPACE tbs_data  DATAFILE '+DATA'  SIZE 100G;
CREATE TABLESPACE tbs_index DATAFILE '+INDEX' SIZE 50G;

-- 建表指定
CREATE TABLE orders (...) TABLESPACE tbs_data;
CREATE INDEX idx_orders_cust ON orders(customer_id) TABLESPACE tbs_index;

-- 物理隔離 (ASM)
-- DATA Diskgroup: 普通冗余、大容量 HDD/SSD 混合
-- INDEX Diskgroup: 高效能 SSD/NVMe、小尺寸 AU (1MB)

索引維護與監控體系

類型機制適用場景限制
索引聚簇多表按叢集鍵值混合儲存同一區塊,叢集鍵建 B*Tree 索引父子表固定關聯、高頻 JOIN、主鍵-外鍵模式叢集鍵值更新昂貴、不支援分區、全表掃描變慢
雜湊聚簇按叢集鍵雜湊分桶,無索引,直接定位區塊等值查詢為主、叢集鍵值分布均勻範圍查詢不支援、桶溢出鏈長影響效能
任務頻率指令/腳本
統計收集每日/變更後DBMS_STATS.GATHER_INDEX_STATS (CASCADE=TRUE)
碎片檢測每週HEIGHT > 3 / PCT_USED < 50% / DELETED_LEAF_ROWS > 20%
重建/縮減碎片超標時ALTER INDEX ... REBUILD ONLINE / COALESCE / SHRINK SPACE
未用索引識別每月V$OBJECT_USAGE (ALTER INDEX ... MONITORING USAGE)
反向鍵索引熱點右側插入CREATE INDEX ... REVERSE (序列/時間鍵)

進階索引類型選擇指南

類型適用場景關鍵語法
函數索引WHERE UPPER(name) = 'SMITH'CREATE INDEX idx_upper_name ON emp(UPPER(ename))
位圖索引DW 低基數欄位、多條件 AND/ORCREATE BITMAP INDEX idx_sex ON emp(sex)
反向鍵索引序列/時間主鍵右側熱點CREATE INDEX idx_rev ON t(seq_col) REVERSE
不可見索引測試索引效果不影響生產CREATE INDEX ... INVISIBLE / ALTER INDEX ... INVISIBLE
部分索引 (12c+)僅索引滿足條件的列CREATE INDEX ... WHERE status = 'ACTIVE'

索引是把雙刃劍:精準建立、分區對齊、物理隔離、持續監控、按需進階,才能在讀寫平衡點上持續獲取淨收益。

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