如何用Oracle 9i全索引掃描完成任務(wù)
再實(shí)際操作中我們?yōu)榱藢?shí)現(xiàn)Oracle數(shù)據(jù)庫關(guān)于增加SQL優(yōu)化查詢智能的保證,Oracle 9i增強(qiáng)了全索引,SQL執(zhí)行計(jì)劃以支持基于功能的相關(guān)索引(function-based index)。在Oracle 8i中,SQL優(yōu)化器添加了判斷查詢是否可以專門用一個(gè)現(xiàn)存的索引來解決的智能。
一旦存在索引,Oracle就會(huì)繞過對(duì)表的訪問,索引組織表(index-organized table,IOT)結(jié)構(gòu)就是一個(gè)例子。
在IOT結(jié)構(gòu)中,所有的數(shù)據(jù)都載入索引的b-樹結(jié)構(gòu),這樣表(table)就成為一個(gè)多余的東西了。
一旦Oracle SQL優(yōu)化器檢測到查詢無需訪問表時(shí),Oracle就調(diào)用全索引掃描并快速讀取每一個(gè)索引塊而無需接觸表本身。有一點(diǎn)很重要:全索引掃描并沒有讀取索引節(jié)點(diǎn),而是一塊一塊的執(zhí)行掃描并快速捕獲索引節(jié)點(diǎn)。***,Oracle調(diào)用多塊讀取功能,調(diào)用多個(gè)過程來讀取表。
Oracle和多塊讀取
為了加快表和索引的訪問速度,Oracle使用了db_file_multiblock_read_count參數(shù)(默認(rèn)參數(shù)為8)來輔助把全表掃描和Oracle 9i全索引掃描所獲得的數(shù)據(jù)塊盡快送到數(shù)據(jù)緩沖區(qū)中。然而,這個(gè)參數(shù)只有當(dāng)SQL查詢執(zhí)行全表掃描時(shí)才可用,并且,在絕大多數(shù)情況下,查詢要使用索引來訪問表。
Oracle對(duì)全索引掃描有如下限制:
SQL請求的全部列(column)必須駐留在索引樹中;也就是說,SELECT和WHERE字句中的所有數(shù)據(jù)列必須存在于索引中。
查詢訪問大量的行(row)。根據(jù)你查詢的范圍,比例變化范圍為10%到25%之間,這個(gè)比例參數(shù)db_file_multiblock_read_count的設(shè)置和查詢的并行程度極大的影響到這個(gè)比例。
由于索引節(jié)點(diǎn)并沒有按索引順序排列,所以列并沒有順序。這樣,ORDER BY字句將要求附加的排序操作。
Oracle提供了一個(gè)SQL提示(hint)來強(qiáng)制Oracle 9i全索引掃描。你也可以通過指定index_ffs提示來強(qiáng)制快速索引掃描,這常常與parallel_index提示組合來提高性能。例如,下面的查詢強(qiáng)迫使用并行快速全索引掃描:
- select distinct /*+ index_ffs(c,pk_auto) parallel_index_
- (automobile, pk_auto) color, count(*)
- from
- automobiles
- group by color;
由于涉及了所有的變量,所以全索引是否會(huì)加快查詢速度并不能簡單的加以回答。所以,大多數(shù)有經(jīng)驗(yàn)的SQL調(diào)試者(tuner)會(huì)對(duì)符合快速Oracle 9i全索引掃描標(biāo)準(zhǔn)的查詢進(jìn)行手工計(jì)時(shí),看看使用全索引掃描的反映時(shí)間是否會(huì)降低。
【編輯推薦】
- Oracle動(dòng)態(tài)Web開發(fā)實(shí)例演示
- 轉(zhuǎn)移Oracle海量數(shù)據(jù)到另外的用戶流程
- Oracle內(nèi)存結(jié)構(gòu)里Process Memory實(shí)際操作步驟
- Oracle同時(shí)訪問N個(gè)SQL Server的實(shí)操
- Oracle細(xì)粒度如何進(jìn)行訪問