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

Oracle 索引建立與分類全攻略:B-Tree、Bitmap、Function-Based、Partitioned 索引選型指南

     編輯:Oracle 教學

索引分類總覽

索引類型適用場景核心特性維護成本
B-Tree (預設)高選擇性列、主鍵、外鍵、範圍查詢、排序平衡樹結構、支援 `=、>、<、>=、<=、BETWEEN、LIKE 'prefix%'`中等
Bitmap低基數列 (性別、狀態、類型)、數據倉庫、星型模型位圖編碼、極佳壓縮、支援布林運算 (AND/OR/NOT)高 (DML 鎖升級)
Function-Based (FBI)查詢含函數/運算式的列 (`UPPER(name)='SMITH'`, `sal*12>50000`)將運算式結果物質化索引、透明改寫中等
Partitioned (本地/全域)大表分區、歷史數據歸檔、ILM本地索引與表分區對齊、全域索引跨分區唯一性中等
Reverse Key單調遞增列 (序列主鍵) 熱塊競爭反轉鍵值分散插入、不支援範圍掃描中等
Composite (組合)多列聯合查詢、覆蓋索引遵循最左前綴、列序 = 選擇性遞減 + WHERE 頻率遞減中等
Invisible (11g+)測試索引移除影響、軟刪除優化器忽略、維護正常、可 `ALTER INDEX ... VISIBLE` 瞬時啟用中等
Virtual Column + Index (11g+)常用運算式透明索引化虛擬欄位不佔儲存、自動維護、查詢重寫透明低

建立索引核心語法

-- 基本 B-Tree
CREATE INDEX idx_emp_dept ON emp(deptno);

-- 唯一索引 (主鍵/唯一約束自動建立)
CREATE UNIQUE INDEX idx_emp_uk ON emp(empno);

-- 組合索引:列序極其重要
CREATE INDEX idx_emp_dept_job ON emp(deptno, job);  -- deptno 選擇性高、常用於 WHERE

-- 位圖索引:僅適合低基數、低併發
CREATE BITMAP INDEX idx_emp_sex ON emp(sex);

-- 函數索引:解決 WHERE 子句函數導致索引失效
CREATE INDEX idx_emp_upper_name ON emp(UPPER(ename));
CREATE INDEX idx_emp_annual_sal ON emp(sal*12);

-- 反向鍵索引:緩解單調遞增主鍵右側增長熱點
CREATE INDEX idx_emp_rev_pk ON emp(empno) REVERSE;

-- 本地分區索引:與表分區一一對應,維護靈活
CREATE INDEX idx_sales_local ON sales(sale_date) LOCAL;

-- 全域分區索引:跨分區強制唯一性
CREATE INDEX idx_sales_global ON sales(cust_id) 
  GLOBAL PARTITION BY HASH(cust_id) PARTITIONS 8;

-- 不可見索引:安全部署/測試
CREATE INDEX idx_emp_test ON emp(hiredate) INVISIBLE;
ALTER INDEX idx_emp_test VISIBLE;  -- 正式啟用

索引選型決策樹

  1. 列基數高 (選擇性 > 0.8)? → B-Tree / 組合 B-Tree
  2. 列基數極低 (性別、狀態) 且為數倉/低併發? → Bitmap
  3. WHERE 子句含函數/運算 (`UPPER`、`TRUNC`、`+`、`||`)? → FBI / 虛擬欄位索引
  4. 表已分區? → 本地分區索引 (首選) / 全域分區索引 (需跨分區唯一)
  5. 主鍵為序列產生、高併發插入? → Reverse Key 或 Hash 分區索引
  6. 需測試移除索引影響? → Invisible Index

建立索引黃金原則

  • 先分析後建立: `DBMS_STATS` 收集統計 → `EXPLAIN PLAN` 確認全掃描 → 針對性建索引。
  • 最左前綴原則: 組合索引 `(A,B,C)` 僅能服務 `A`、`A,B`、`A,B,C` 前綴條件。
  • 避免冗餘: 單列索引 `(A)` + 組合索引 `(A,B)` → 單列索引通常可刪除。
  • 小表勿建: < 5MB 或 < 5000 行表,全掃描往往更快。
  • 指定表空間: `TABLESPACE idx_tbs` 實現表索引 I/O 隔離。
  • 並行建立: 大表 `CREATE INDEX ... PARALLEL 8` 加速,建立後 `NOPARALLEL`。
  • 線上重建: `ALTER INDEX ... REBUILD ONLINE` 業務零停機整理碎片。

索引監控與生命週期管理

-- 監控索引使用情況 (11g+)
ALTER INDEX idx_emp_dept MONITORING USAGE;
-- 一段時間後
SELECT * FROM v$object_usage WHERE index_name = 'IDX_EMP_DEPT';
ALTER INDEX idx_emp_dept NOMONITORING USAGE;

-- 定期重建碎片化索引
SELECT index_name, 
       ROUND(100 * (leaf_blocks - (SELECT SUM(bytes)/8192 FROM user_segments WHERE segment_name = index_name)) / leaf_blocks, 2) AS pct_fragmented
FROM user_indexes
WHERE pct_fragmented > 20  -- 碎片率超 20% 考慮重建
ORDER BY pct_fragmented DESC;

索引是資料庫效能的加速器,亦是維護成本的來源。**精準選型、定期體檢、适時重建**,讓索引持續賦能業務增長。

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