1.隱式轉(zhuǎn)換導(dǎo)致索引失效.這一點(diǎn)應(yīng)當(dāng)引起重視.也是開(kāi)發(fā)中經(jīng)常會(huì)犯的錯(cuò)誤.由于表的字段tu_mdn定義為varchar2(20),但在查詢時(shí)把該字段作為number類型以where條件傳給Oracle,這樣會(huì)導(dǎo)致索引失效. 錯(cuò)誤的例子:select * fromtest where tu_mdn=13333333333; 正確的例子:select * fromtest where tu_mdn='13333333333'; 2.對(duì)索引列進(jìn)行運(yùn)算導(dǎo)致索引失效,我所指的對(duì)索引列進(jìn)行運(yùn)算包括(+,-,*,/,! 等)錯(cuò)誤的例子:select* from test where id-1=9; 正確的例子:select * fromtest where id=10; 3.使用Oracle內(nèi)部函數(shù)導(dǎo)致索引失效.對(duì)于這樣情況應(yīng)當(dāng)創(chuàng)建基于函數(shù)的索引.錯(cuò)誤的例子:select * from test where round(id)=10;說(shuō)明,此時(shí)id的索引已經(jīng)不起作用了 正確的例子:首先建立函數(shù)索引,create index test_id_fbi_idx on test(round(id));然后select * from test where round(id)=10; 這時(shí)函數(shù)索引起作用了 4.以下使用會(huì)使索引失效,應(yīng)避免使用;a. 使用 <> 、not in、not exist、!= b. like "%_"百分號(hào)在前(可采用在建立索引時(shí)用reverse(columnName)這種方法處理) c. 單獨(dú)引用復(fù)合索引里非第一位置的索引列.應(yīng)總是使用索引的第一個(gè)列,如果索引是建立在多個(gè)列上,只有在它的第一個(gè)列被where子句引用時(shí),優(yōu)化器才會(huì)選擇使用該索引。 d.字符型字段為數(shù)字時(shí)在where條件里不添加引號(hào). e.當(dāng)變量采用的是times變量,而表的字段采用的是date變量時(shí).或相反情況。 5. 不要將空的變量值直接與比較運(yùn)算符(符號(hào))比較。如果變量可能為空,應(yīng)使用 IS NULL 或 IS NOT NULL 進(jìn)行比較,或者使用 ISNULL函數(shù)。6. 不要在 SQL 代碼中使用雙引號(hào)。因?yàn)樽址A渴褂脝我?hào)。如果沒(méi)有必要限定對(duì)象名稱,可以使用(非 ANSI SQL標(biāo)準(zhǔn))括號(hào)將名稱括起來(lái)。7.將索引所在表空間和數(shù)據(jù)所在表空間分別設(shè)于不同的磁盤(pán)chunk上,有助于提高索引查詢的效率。8.Oracle默認(rèn)使用的基于代價(jià)的SQL優(yōu)化器(CBO)非常依賴于統(tǒng)計(jì)信息,一旦統(tǒng)計(jì)信息不正常,會(huì)導(dǎo)致數(shù)據(jù)庫(kù)查詢時(shí)不使用索引或使用錯(cuò)誤的索引。一般來(lái)說(shuō),Oracle的自動(dòng)任務(wù)里面會(huì)包含更新統(tǒng)計(jì)信息的語(yǔ)句,但如果表數(shù)據(jù)發(fā)生了比較大的變化(超過(guò)20%),可以考慮立即手動(dòng)更新統(tǒng)計(jì)信息,例如:analyze table abc computestatistics,但注意,更新統(tǒng)計(jì)信息比較耗費(fèi)系統(tǒng)資源,建議在系統(tǒng)空閑時(shí)執(zhí)行。9. Oracle在進(jìn)行一次查詢時(shí),一般對(duì)一個(gè)表只會(huì)使用一個(gè)索引.因此,有時(shí)候過(guò)多的索引可能導(dǎo)致Oracle使用錯(cuò)誤的索引,降低查詢效率。例如某表有索引1(Policyno)和索引2(classcode),如果查詢條件為policyno = ‘xx’ and classcode = ‘xx’,則系統(tǒng)有可能會(huì)使用索引2,相較于使用索引1,查詢效率明顯降低。10. 優(yōu)先且盡可能使用分區(qū)索引。