Oracle執(zhí)行計(jì)劃不走索引的原因總結(jié)
在Oracle數(shù)據(jù)庫(kù)操作中,為什么有時(shí)一個(gè)表的某個(gè)字段明明有索引,當(dāng)觀察一些語(yǔ)的執(zhí)行計(jì)劃確不走索引呢?如何解決呢?本文我們主要就介紹這部分內(nèi)容,接下來(lái)就讓我們一起來(lái)了解一下。
不走索引大體有以下幾個(gè)原因:
- 你在Instance級(jí)別所用的是all_rows的方式
- 你的表的統(tǒng)計(jì)信息(最可能的原因)
- 你的表很小,上文提到過的,Oracle的優(yōu)化器認(rèn)為不值得走索引。
解決方法:
可以修改init.ora中的OPTIMIZER_MODE這個(gè)參數(shù),把它改為Rule或Choose,重起數(shù)據(jù)庫(kù)。也可以使用4中所提的Hint。
不走索引的其它原因:
1、建立組合索引,但查詢謂詞并未使用組合索引的***列,此處有一個(gè)INDEX SKIP SCAN概念。
2、在包含有null值的table列上建立索引,當(dāng)時(shí)使用select count(*) from table時(shí)不會(huì)使用索引。
3、在索引列上使用函數(shù)時(shí)不會(huì)使用索引,如果一定要使用索引只能建立函數(shù)索引。
4、當(dāng)被索引的列進(jìn)行隱式的類型轉(zhuǎn)換時(shí)不會(huì)使用索引。如:select * from t where indexed_column = 5,而indexed_column列建立索引但類型是字符型,這時(shí)Oracle會(huì)產(chǎn)生隱式的類型轉(zhuǎn)換,轉(zhuǎn)換后的語(yǔ)句類似于select * from t where to_number(indexed_column) = 5,此時(shí)不走索引的情況類似于case3。日期轉(zhuǎn)換也有類似問題,如: select * from t where trunc(date_col) = trunc(sysdate)其中date_col為索引列,這樣寫不會(huì)走索引,可改寫成select * from t where date_col >= trunc(sysdate) and date_col < trunc(sysdate+1),此查詢會(huì)走索引。
5、并不是所有情況使用索引都會(huì)加快查詢速度,full scan table 有時(shí)會(huì)更快,尤其是當(dāng)查詢的數(shù)據(jù)量占整個(gè)表的比重較大時(shí),因?yàn)閒ull scan table采用的是多塊讀,當(dāng)Oracle優(yōu)化器沒有選擇使用索引時(shí)不要立即強(qiáng)制使用,要充分證明使用索引確實(shí)查詢更快時(shí)再使用強(qiáng)制索引。
6、<>
7、like’%dd’百分號(hào)在前。
關(guān)于Oracle執(zhí)行計(jì)劃不走索引的原因的相關(guān)知識(shí)的總結(jié)就介紹到這里了,希望本次的介紹能夠?qū)δ兴斋@!
【編輯推薦】






