索引唯一性掃描 針對唯一索引,因確定最多回傳一筆資料,邏輯讀至少比索引範圍掃描少 1。索引範圍掃描取得第一筆後,仍需向下至少再掃描一個葉子節點以確認是否還有符合條件的資料。
Oracle 執行索引全掃描時,不需掃描所有分支區塊,僅透過必要的分支區塊定位到最左側葉子區塊的第一筆索引列,再利用葉子區塊間的雙向指標鏈表遍歷。因按邏輯順序從左至右掃描,結果天然有序。通常不需回表,例如 SELECT COUNT(*) FROM table 或 SELECT empno FROM emp。前提是目標索引至少有一個鍵值列為 NOT NULL。
與索引全掃描類似,通常也不回表,但有關鍵差異:
適用於所有複合 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 值較少、非前導列選擇性極佳的情境。前導列唯一值越多,執行效率遞減越明顯。