Oracle 9i全索引掃描和函數(shù)索引一起工作的原理
如果你度數(shù)據(jù)庫(kù)的相關(guān)實(shí)際操作很感興趣的話沒(méi)那么你肯定會(huì)知道在Oracle9i之前,Oracle 9i全索引掃描只有再創(chuàng)建相關(guān)索引時(shí),沒(méi)有空值的時(shí)候才可以進(jìn)行使用,也就是說(shuō),Oracle建立索引時(shí)必須用一個(gè)NOT NULL子句才可以使用該索引。由于Oracle9i支持用函數(shù)(function-based)索引實(shí)現(xiàn)的唯索索引掃描,這種情況大大改觀。
簡(jiǎn)單回歸一下,函數(shù)索引是Oracle8的一個(gè)重要改進(jìn),因?yàn)樗峁┝艘环N有效的消除無(wú)必要長(zhǎng)表全掃描的機(jī)制,由于函數(shù)索引可以在任何查詢語(yǔ)句中的WHERE子句中精確復(fù)制,Oracle總會(huì)用一個(gè)索引來(lái)匹配上SQL查詢的WHERE子句。
現(xiàn)在,我要會(huì)用一個(gè)student表來(lái)舉一個(gè)簡(jiǎn)單的例子來(lái)解釋Oracle 9i全索引掃描如何與函數(shù)索引一起工作的過(guò)程。
創(chuàng)建student表
- (student_name varchar2(40), date_of_birth date);
使用這個(gè)表,創(chuàng)建與表中所有列相關(guān)聯(lián)的函數(shù)索引。在本例中,該函數(shù)為initcap(即大寫每個(gè)單詞的首字母)和to_char(即把一個(gè)數(shù)字變成字符):
- create index whole_student
- on student
- (initcap(student_name), to_char(date_of_birth,’MM-DD-YY’));
定義完函數(shù)索引后,Oracle9i中任何可以引用這些列(column)的SQL語(yǔ)句都可以使用Oracle 9i全索引掃描。下面是SQL匹配函數(shù)索引的查詢例子:
- select * from student
- where initcap(student_name) = ‘Jones’;
- select * from student
- where to_char(date_of_birth,’MM-DD=YY’) = ’04-07-85’;
用函數(shù)索引來(lái)調(diào)用全索引掃描
Oracle9i只要可能就會(huì)使用函數(shù)索引并在函數(shù)索引的基礎(chǔ)上調(diào)用全索引掃描。如果SQL優(yōu)化器統(tǒng)計(jì)結(jié)果表明使用全索引掃描的速度將會(huì)超過(guò)通過(guò)索引的b-樹訪問(wèn)的速度,那么Oracle9i就會(huì)這么做。
下面是用函數(shù)索引調(diào)用唯索掃描的準(zhǔn)則。所有的SQL謂詞匹配索引中的列,查詢必須從表中返回足夠多的行,這樣做的目的是為了讓代價(jià)優(yōu)化器(cost-based optimizer)來(lái)判斷全索引掃描是否要比傳統(tǒng)的索引訪問(wèn)方法要快。是否調(diào)用全索引掃描的決定取決于下面幾個(gè)參數(shù)設(shè)置:
代價(jià)優(yōu)化器的適當(dāng)統(tǒng)計(jì)數(shù)字——這個(gè)計(jì)劃(schema)最近已經(jīng)分析過(guò)了,而且optimizer_mode參數(shù)不能設(shè)置為RULE。
索引的并行程度——注意索引的并行程度是獨(dú)立設(shè)置的;索引并沒(méi)有繼承表的并行程度。
optimizer_index_cost_adj的設(shè)置——它控制代價(jià)優(yōu)化器是否傾向于Oracle 9i全索引掃描。
db_file_multiblock_read_count的設(shè)置——這個(gè)參數(shù)影響到全索引掃描的代價(jià)。這個(gè)值越高,全索引掃描的代價(jià)也就會(huì)越“便宜”。
索引的直方圖表示——對(duì)偏移(skewed)索引,它幫助代價(jià)優(yōu)化器評(píng)估查詢返回的行數(shù)。
Oracle的一個(gè)重要提高
在函數(shù)索引基礎(chǔ)上的快速全索引掃描是Oracle9i的另一個(gè)提高性能的途徑。當(dāng)數(shù)據(jù)庫(kù)遷移到Oracle9i時(shí),許多數(shù)據(jù)庫(kù)自動(dòng)開始使用這個(gè)新的執(zhí)行計(jì)劃。不過(guò),當(dāng)SQL代價(jià)優(yōu)化器決定是否選擇全索引掃描時(shí),還要考慮幾個(gè)因素。Oracle專業(yè)人員需要適當(dāng)設(shè)置參數(shù),以確保代價(jià)優(yōu)化器不會(huì)用不合適的方式使用快速Oracle 9i全索引掃描——這一點(diǎn)需要特別注意。
【編輯推薦】