【摘】Oracle執行計劃不走索引的緣由總結

感謝原博主html

http://soft.chinabyte.com/database/364/12471864.shtml數據庫

 

Oracle數據庫操做中,爲何有時一個表的某個字段明明有索引,當觀察一些語的執行計劃確不走索引呢?如何解決呢?本文咱們主要就介紹這部份內容,接下來就讓咱們一塊兒來了解一下。oracle

  不走索引大致有如下幾個緣由:函數

  你在Instance級別所用的是all_rows的方式優化

  你的表的統計信息(最可能的緣由)htm

  你的表很小,上文提到過的,Oracle的優化器認爲不值得走索引。索引

  解決方法:get

  能夠修改init.ora中的OPTIMIZER_MODE這個參數,把它改成Rule或Choose,重起數據庫。也可使用4中所提的Hint。it

  不走索引的其它緣由:table

  一、創建組合索引,但查詢謂詞並未使用組合索引的第一列,此處有一個INDEX SKIP SCAN概念。

  二、在包含有null值的table列上創建索引,當時使用select count(*) from table時不會使用索引。

  三、在索引列上使用函數時不會使用索引,若是必定要使用索引只能創建函數索引。

  四、當被索引的列進行隱式的類型轉換時不會使用索引。如:select * from t where indexed_column = 5,而indexed_column列創建索引但類型是字符型,這時Oracle會產生隱式的類型轉換,轉換後的語句相似於select * from t where to_number(indexed_column) = 5,此時不走索引的狀況相似於case3。日期轉換也有相似問題,如: select * from t where trunc(date_col) = trunc(sysdate)其中date_col爲索引列,這樣寫不會走索引,可改寫成select * from t where date_col >= trunc(sysdate) and date_col < trunc(sysdate+1),此查詢會走索引。

  五、並非全部狀況使用索引都會加快查詢速度,full scan table 有時會更快,尤爲是當查詢的數據量佔整個表的比重較大時,由於full scan table採用的是多塊讀,當Oracle優化器沒有選擇使用索引時不要當即強制使用,要充分證實使用索引確實查詢更快時再使用強制索引。

  六、<>

  七、like’%dd’百分號在前。

  關於Oracle執行計劃不走索引的緣由的相關知識的總結就介紹到這裏了,但願本次的介紹可以對您有所收穫!

相關文章
相關標籤/搜索