天天看點

oracle點知識6——索引跳躍式掃描

以下内容整理自網絡:

索引跳躍式掃描(index skip scan)是Oracle9i用來提高性能的新特性,對于使用複合索引的資料庫應用程式意義尤為重大。   

複合索引(又稱為連接配接索引)是一個包含多個字段的索引。在ORACLE9i以前的ORACLE版本裡,隻有那些在WHERE子句裡引用整個索引或者是引用索引的一個或多個前導字段的查詢,才能使複合索引有效而提高檢索效率。而在ORACLE9i裡,一個複合索引即使在一次查詢中沒有使用前導字段,也可能通過“索引跳躍式掃描”被有效引用(比如有兩個字段id,name;我們隻使用了name這個字段作為索引,而沒有使用id,這樣也可以通過 索引跳躍式掃描)。在一次跳躍式掃描中,每個複合索引前導字段的獨特值(DISTINCT

VALUE)隻會被搜尋一次,ORACLE9i會在複合索引前導字段每個獨特值區間結合WHERE子句中的其它複合索引字段搜尋符合條件的目标記錄,這種做法的結果導緻了在索引中的跳躍式掃描。

索引跳躍式掃描主要有兩個優點:

1、以前版本中的表掃描(TABLE SCAN)可能會轉變為索引掃描,提高了某些查詢的執行效率;

2、應用程式使用較少的索引就能達到提高效能的目的,并且既節省存儲空間,又能提高DML和維護操作的效率。

我們通過下面的示例,徹底了解索引跳躍式掃描的含義:

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在内部上生成了多個查詢,這樣就滿足帶有多個子查詢的查詢。

  在内部裡,Oracle生成了兩個查詢,并連接配接結果的ROWID表。

  使用索引跳躍式掃描的内涵就變得很清晰。