首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

Oracle 索引存取方法深度解析:唯一掃描、全掃描、快速全掃描與跳躍式掃描

     編輯:Oracle 資料庫相關知識

索引唯一性掃描 vs 索引範圍掃描

索引唯一性掃描 針對唯一索引,因確定最多回傳一筆資料,邏輯讀至少比索引範圍掃描少 1。索引範圍掃描取得第一筆後,仍需向下至少再掃描一個葉子節點以確認是否還有符合條件的資料。

索引全掃描

Oracle 執行索引全掃描時,不需掃描所有分支區塊,僅透過必要的分支區塊定位到最左側葉子區塊的第一筆索引列,再利用葉子區塊間的雙向指標鏈表遍歷。因按邏輯順序從左至右掃描,結果天然有序。通常不需回表,例如 SELECT COUNT(*) FROM table 或 SELECT empno FROM emp。前提是目標索引至少有一個鍵值列為 NOT NULL。

索引快速全掃描

與索引全掃描類似,通常也不回表,但有關鍵差異:

  • 僅在 CBO(成本基礎優化器)模式下可用。
  • 索引全掃描無法平行執行,而快速全掃描支援多區塊讀取與平行執行。
  • 結果不保證有序,因依據索引列在磁碟上的物理儲存位置掃描,而非邏輯順序。

索引跳躍式掃描

適用於所有複合 B 樹索引(含唯一與非唯一)。當 WHERE 條件未指定前導列,但指定了非前導列時,仍可使用該索引。例如索引建於 (gender, eno),查詢 WHERE eno = 100 仍可用。

原理是 Oracle 內部將 SQL 改寫,補入前導列的所有可能值。若 gender 僅有 'F'、'M' 兩值,改寫為:

SELECT * FROM test WHERE gender='F' AND eno=100
UNION ALL
SELECT * FROM test WHERE gender='M' AND eno=100;

因此,跳躍式掃描僅適合前導列 DISTINCT 值較少、非前導列選擇性極佳的情境。前導列唯一值越多,執行效率遞減越明顯。

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