索引唯一性掃描(INDEX UNIQUE SCAN)(針對unique index的掃描)比索引范圍掃描(INDEX UNIQUE SCAN)需要的邏輯讀至少少1,這是因為索引唯一行掃描明確只有最多一行數據返回,而索引范圍掃描則可能有多行數據返回,得到第一行數據之後還會向下至少再掃一個葉子節點。
索引全掃描(INDEX FULL SCAN):索引全掃描不需要掃描該索引的所有分支塊,oracle在做索引全掃描的時候只需要訪問必要的分支塊的定位到位於該索引最左邊的葉子塊的第一行索引行,通過葉子塊之間的雙向指針鏈表就可以互相訪問了。因為是按照從左至右進行掃描的,所以索引全掃描得到的數據是排好序的。索引全掃描一般都是不回表的,例如select count(*) from table; select empno from emp;能做索引全掃描的一個條件就是目標索引至少有一個索引鍵值列的屬性是not null。
索引快速全掃描(INDEX FAST FULL SCAN):和索引全掃描差不多,一般也是不回表的,但也有很多區別。
和索引全掃描的區別是:
索引快速全掃描只有在CBO中能用
索引全掃描不能並行執行,而索引快速全掃描既可以使用多塊讀也可以使用並行執行。
索引快速全掃描的結果並不一定是有序的。因為索引快速全掃描時Oracle是根據索引行在磁盤上的物理存儲位置來掃描的,而不是根據索引行的邏輯順序掃描的。
索引跳躍式掃描(INDEX SKIP SCAN):適合所有類型的復合B樹索引,(包括唯一性索引和非唯一性索引),它使得那些在where條件中沒有針對目標索引的前導列指定查詢條件同時又對該索引的非前導列制定了查詢條件的目標SQL依然能夠使用該索引。
例如索引建在(gender,eno)兩列,where條件中沒有gender條件只有例如emp=100這種查詢條件依然可以使用該復合B樹索引。
之所以能用是因為oracle幫我們對sql語句進行了改寫,將前導列加了進來。
原語句:
select * from test where eno=100;
如果此時gender列只有兩個取值F和M,oracle會幫我們把它改寫成
select * form test where gender='F' and eno=100
union all
select * from test where gender='M' and eno=100;
從此可以看出oracle中的索引跳躍式掃描只適用於那些目標索引前導列的distinct值數量較少,後續非前導列的可選擇性又非常好的情形,因為索引跳躍式掃描的執行效率一定會隨著目標索引前導列的distinct值數量的遞增而遞減。