Oraclei裡的僅索引(indexonly)執行計劃在Oraclei裡得到了加強所以現在能夠提供對基於函數的索引(functionbased indexFBI)的支持Oracle的索引組織表(indexorganized tableIOT)是一個很好的例子能夠說明Oracle如何在可能的時候忽略對表格的訪問簡而言之每當Oracle SQL優化器檢測到它能夠為查詢提供服務而不需要觸及表格行的時候Oracle就會調用一個完整的索引掃描快速讀取索引的每個塊而不需要觸及表格本身
完整索引執行計劃要比訪問表格更快其原因有兩個
DB_FILE_MULTIBLOCK_READ_COUNT會被調用以便更快地預先取回索引塊
完整索引掃描能夠使用Oracle的平行查詢
在Oraclei之前的版本裡只有在索引被創建而且不帶有任何NULL值的時候僅索引掃描才可能被使用FBI是Oracle的一個福音它們事實上能夠消除任何不必要的完整表格掃描由於FBI能夠精確地復制查詢的WHERE子句裡的任何數據列所以它們一般都被用來確保索引正在服務查詢
為了說明完全索引掃描如何同FBI一起工作現在讓我們來看下面這個關於學生的簡單表格
create table
student
(
student_name
date_of_birth
);
利用這個表格我們在表格所有的數據列上創建了一個已連接的FBI
create index
whole_student
on
student
(
initcap(student_name)
to_char(date_of_birthMMDDYY)
);
Oraclei知道參照SQL陳述式裡這些數據列的任何查詢都能夠使用完整索引掃描
select * from student
where
initcap(student_name) = Jones;
select * from student
where
to_char(date_of_birthMMDD=YY) = ;
那麼什麼時候Oracle會選擇完整索引掃描呢?實際上完整索引掃描是非常少見的其原因有兩個
Oraclei會要求WHERE子句裡的所有判斷述詞(predicate)都匹配索引裡的這些數據列
任何指定的數據列都有眾多的內置函數可用因此更有可能的情況是會存在完全匹配查詢的索引
From:http://tw.wingwit.com/Article/program/Oracle/201311/18035.html