怎樣在9i里對基于函數的索引進(jìn)行僅索引掃描?

4年前 (2021-04-23)閱讀596回復0
地產(chǎn)畫(huà)冊
地產(chǎn)畫(huà)冊
  • 管理員
  • 發(fā)消息
  • 注冊排名682
  • 經(jīng)驗值115
  • 級別管理員
  • 主題23
  • 回復0
樓主

??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)的索引。

0
0
收藏0
回帖

怎樣在9i里對基于函數的索引進(jìn)行僅索引掃描? 期待您的回復!

取消
載入表情清單……
載入顏色清單……
插入網(wǎng)絡(luò )圖片

取消確定

圖片上傳中
編輯器信息
提示信息