怎樣在9i里對基于函數的索引進(jìn)行僅索引掃描?
??Oracle8i里的僅索引(index-only)執行計劃在Oracle9i里得到了加強,所以現在能夠提供對基于函數的索引(function-based index,FBI)的支持。Oracle的索引組織表(index-organized table,IOT)是一個(gè)很好的例子,能夠說(shuō)明Oracle如何在可能的時(shí)候忽略對表格的訪(fǎng)問(wèn)。
??簡(jiǎn)而言之,每當Oracle SQL優(yōu)化器檢測到它能夠為查詢(xún)提供服務(wù),而不需要觸及表格行的時(shí)候,Oracle就會(huì )調用一個(gè)完整的索引掃描,快速讀取索引的每個(gè)塊,而不需要觸及表格本身。
完整索引執行計劃要比訪(fǎng)問(wèn)表格更快,其原因有兩個(gè):
1。DB_FILE_MULTIBLOCK_READ_COUNT會(huì )被調用,以便更快地預先取回索引塊。
2。完整索引掃描能夠使用Oracle的平行查詢(xún)。
在Oracle9i之前的版本里,只有在索引被創(chuàng )建而且不帶有任何NULL值的時(shí)候,僅索引掃描才可能被使用。FBI是Oracle8的一個(gè)福音,它們事實(shí)上能夠消除任何不必要的完整表格掃描。由于FBI能夠精確地復制查詢(xún)的WHERE子句里的任何數據列,所以它們一般都被用來(lái)確保索引正在服務(wù)查詢(xún)。
為了說(shuō)明完全索引掃描如何同FBI一起工作,現在讓我們來(lái)看下面這個(gè)關(guān)于學(xué)生的簡(jiǎn)單表格:
create table
student
student_name,
date_of_birth
利用這個(gè)表格,我們在表格所有的數據列上創(chuàng )建了一個(gè)已連接的FBI:
create index
whole_student
on
student
initcap(student_name),
to_char(date_of_birth,'MM-DD-YY')
Oracle9i知道,參照SQL陳述式里這些數據列的任何查詢(xún)都能夠使用完整索引掃描:
select * from student
where
initcap(student_name) = 'Jones';
select * from student
where
to_char(date_of_birth,'MM-DD=YY') = '04-07-85';
那么,什么時(shí)候Oracle會(huì )選擇完整索引掃描呢?實(shí)際上,完整索引掃描是非常少見(jiàn)的,其原因有兩個(gè):
1。
??Oracle9i會(huì )要求WHERE子句里的所有判斷述詞(predicate)都匹配索引里的這些數據列。
2。任何指定的數據列都有眾多的內置函數可用,因此更有可能的情況是:會(huì )存在完全匹配查詢(xún)的索引。