索引跳躍式掃描(INDEX SKIP SCAN)

執行計劃中存在索引跳掃步驟 存在索引跳掃說明查詢條件和索引定義不嚴格匹配

對於組合索引來說,在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才能找回結果 。

索引跳躍式掃描(INDEX SKIP SCAN)

索引跳躍式掃描(INDEX SKIP SCAN)適用於所有類型的複合B樹索引(包括唯一性索引和非唯一性索引),它使那些在where條件中沒有對目標索引的前導列指定查詢條件但同時又對該 索引的非前導列指定了查詢條件的目標SQL依然可以用上該索引,這就像是在掃描該索引時跳過了它的前導列,直接從該索引的非前導列開始掃描一樣(實際的執行過程並非如此),這也是索引跳躍式掃描中"跳躍"(SKIP)一詞的含義。

爲什麼在where條件中沒有對目標索引的前導列指定查詢條件但Oracle依然可以用上該索引呢?這是因爲Oracle幫你對該索引的前導列的所有distinct值做了遍歷。

Oracle中的索引跳躍式掃描僅僅適用於那些目標索引前導列的distinct值數量較少、後續非前導列的可選擇性又非常好的情形,因爲索引跳躍式掃描的執行效率一定會隨着目標索引前導列的distinct值數量的遞增而遞減。

參考:https://www.cnblogs.com/xqzt/p/4467482.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章