索引跳躍式掃描(index skip scan)是Oracle9i的一個新的執行特性,尤其適用於使用連接索引和訪問多值索引的Oracle查詢。讓我們看以下的范例。請注意到以下代碼包含著連接索引:
create index sex_emp_id on emp (sex, emp_id) ;
在Oracle9i版本之前,當SQL查詢中包含性別和emp_id時,或者查詢指定性別行的時候才可以使用這一索引。下面的查詢不能夠使用連接索引:
select emp_id from emp where emp_id = 123;
Oracle9i的索引跳躍式掃描執行規則允許使用連接索引,即使SQL查詢中不指定性別。這一特性使得無需在emp_id行中提供第二個索引。Oracle承認索引跳躍式掃描沒有直接索引查詢速度快,但可以這樣說,相比於整個表掃描(table scan),索引跳躍式掃描的速度要快得多。
當Oracle沒有指明索引跳躍式掃描的內部內容時,我們可以從它的執行規則中判斷出,Oracle在內部上生成了多個查詢,這樣就滿足帶有多個子查詢的查詢。
SELECT STATEMENT Optimizer=CHOOSE (Cost=6 Card=1 Bytes=5) 0 SORT (AGGREGATE) 1 INDEX (SKIP SCAN) OF 'SEX_EMP_ID' (NON-UNIQUE)
在內部裡,Oracle生成了兩個查詢,並連接結果的ROWID表。
selectemp_name from emp_where sex = 'F' and emp_id = 123 UNION select emp_name from emp_where sex = 'M' and emp_id = 123;
使用索引跳躍式掃描的內涵就變得很清晰。對於高順序鍵(high order key)中的獨特值數目,Oracle的索引跳躍式掃描性能將會降低。如果主列有50個值,Oracle要發出50條查詢才能找回結果。索引跳躍式掃描只適用於硬盤空間和存儲空間相當緊缺的情況。