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

PL/SQL 性能優化系列 01:Oracle 索引基礎架構與核心原理解析

     編輯:Oracle 教學

Oracle 索引基礎架構與核心原理

索引是關係型資料庫效能優化的核心機制。本文作為「PL/SQL 性能優化系列」第一篇,系統梳理 Oracle 索引的儲存結構、B-Tree 運作原理、索引類型分類及選擇性原則,為後續優化實戰奠定理論基礎。

一、索引儲存結構:B-Tree(平衡樹)

Oracle 預設索引為 B-Tree(Balanced Tree),特點:

  • 高度平衡: 根節點到任一葉塊路徑長度相同(Height/Level 相同),保證任意鍵值查找 I/O 次數穩定。
  • 分層結構: Root Block → Branch Blocks → Leaf Blocks。葉塊儲存 (Key Value, Rowid) 配對,按鍵值有序排列。
  • Rowid 定位: 索引不直接儲存行資料,透過 Rowid 快速定位表塊。

二、核心索引類型與適用場景

索引類型特點適用場景
B-Tree 索引(預設)平衡樹,支援等值、範圍、排序、分組高選擇性欄位、OLTP 核心查詢、主鍵/唯一約束
Bitmap 索引位圖編碼,壓縮儲存,鎖定粒度大低基數欄位(性別、狀態)、數據倉庫、唯讀/批量載入環境
Function-Based 索引儲存函數運算結果WHERE 子句含函數運算(如 UPPER(name))、避免隱含轉換
Reverse Key 索引反轉鍵值位元組順序避免單調遞增鍵值(序列號)導致右邊緣爭用
Partitioned 索引Local(等分區) / Global(跨分區)大表分區表、分區裁剪、維護彈性
Domain 索引擴展索引型別(如 Oracle Text)全文檢索、空間數據、多媒體索引

三、索引選擇性與 Clustering Factor

  • 選擇性: Distinct Keys / Num Rows。越接近 1(唯一索引)效果越好;< 0.01 通常不被優化器採用。
  • Clustering Factor(聚簇因子): 衡量索引順序與表物理順序一致程度。接近 Blocks 表好,接近 Num Rows 表差。差的 CF 導致索引範圍掃描產生大量隨機 I/O。

四、常見索引失效原因

  1. 隱含型別轉換:WHERE num_col = '123'(字串比數字)
  2. 函數運算索引欄:WHERE UPPER(name) = 'ABC'(無 FBI)
  3. 前導欄缺失:複合索引 (A,B,C),查詢僅 WHERE B=1
  4. IS NULL / NOT IN / != / LIKE '%abc' 等無法走 B-Tree 範圍掃描
  5. 統計資訊過期,優化器誤判成本

五、索引維護最佳實踐

  • 定期 DBMS_STATS.GATHER_TABLE_STATS(..., CASCADE=>TRUE) 收集統計資訊。
  • 監控 V$OBJECT_USAGE 識別未使用索引,評估刪除以減輕 DML 開銷。
  • 大批量載入前設 UNUSABLE,載入後 REBUILD,避免索引維護開銷。
  • 分區表優先使用 Local 索引,支援分區級維護(TRUNCATE PARTITION 自動維護)。

六、下一篇預告

下一篇將深入探討 Join 關聯機制(Hash Join、Nested Loops、Sort Merge Join)與 執行計劃分析實戰。

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