在9i里對基于函數的索引進行僅索引掃描
2024-07-21 02:33:28
供稿:網友
Oracle8i里的僅索引(index-only)執行計劃在Oracle9i里得到了加強,所以現在能夠提供對基于函數的索引(function-based index,FBI)的支持。Oracle的索引組織表(index-organized table,IOT)是一個很好的例子,能夠說明Oracle如何在可能的時候忽略對表格的訪問。 簡而言之,每當Oracle SQL優化器檢測到它能夠為查詢提供服務,而不需要觸及表格行的時候,Oracle就會調用一個完整的索引掃描,快速讀取索引的每個塊,而不需要觸及表格本身。
完整索引執行計劃要比訪問表格更快,其原因有兩個:
1.DB_FILE_MULTIBLOCK_READ_COUNT會被調用,以便更快地預先取回索引塊。
2.完整索引掃描能夠使用Oracle的平行查詢。
在Oracle9i之前的版本里,只有在索引被創建而且不帶有任何NULL值的時候,僅索引掃描才可能被使用。FBI是Oracle8的一個福音,它們事實上能夠消除任何不必要的完整表格掃描。由于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_birth,'MM-DD-YY')
);
Oracle9i知道,參照SQL陳述式里這些數據列的任何查詢都能夠使用完整索引掃描:
select * from student
where
initcap(student_name) = 'Jones';
select * from student
where
to_char(date_of_birth,'MM-DD=YY') = '04-07-85';
那么,什么時候Oracle會選擇完整索引掃描呢?實際上,完整索引掃描是非常少見的,其原因有兩個:
1.Oracle9i會要求WHERE子句里的所有判定述詞(PRedicate)都匹配索引里的這些數據列。
2.任何指定的數據列都有眾多的內置函數可用,因此更有可能的情況是:會存在完全匹配查詢的索引。