跳躍式索引掃描(index skip scan) [final]

tolywang發表於2011-01-05


對於組合索引來說,在oracle8i之前,如果where字句中沒有組合索引的前導列
(即建立索引時排在第一位的欄位)的話,這個組合索引在SQL語句中是不起任何作用的,
在oracle9i中引入了跳躍式掃描,也就是如果在where字句中沒有前導列的話也可以使
用組合索引後面的列進行索引掃描,條件就是前導列的distinct的值不能太多,比如
100萬記錄中,前導列只有 "男","女" 兩個值 。 

不過,Oracle承認索引跳躍式掃描沒有直接索引查詢速度快,但可以這樣說,相比於
整個表掃描(full table scan),索引跳躍式掃描的速度要快得多。

 

例子:

create index sex_emp_id
on emp (sex, emp_id) ;

select  emp_name
from emp  
where emp_id = 123;


透過執行計劃可以看出,Oracle使用跳躍式索引掃描其實就是將上面的語句劃分
為以下語句執行,相當於使用了sex這個前導列,所以使用上了索引。

select emp_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)中的獨特值數目(也就是前導列distinct值太多),
Oracle的索引跳躍式掃描效能將會降低。如果主列(前導列)有50個不同值,根據
上面的SQL執行拆分分析,那麼Oracle要發出50條查詢union才能找回結果 。

 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/35489/viewspace-683309/,如需轉載,請註明出處,否則將追究法律責任。

相關文章