不走索引的原因

補充:不走索引的原因,甚至加上hint 還不走索引,那可能是因爲你要走索引的這列是nullable,雖然這列沒有空值。(將字段改爲not null)

備註 : 不走索引的其它原因

1、建立組合索引,但查詢謂詞並未使用組合索引的第一列,此處有一個INDEX SKIP SCAN概念。
2、在包含有null值的table列上建立索引,當時使用select count(*) from table時不會使用索引。
3、在索引列上使用函數時不會使用索引,如果一定要使用索引只能建立函數索引。

如:

Where條件中對字段增加處理函數將不使用該列的索引
select * from emp where to_char(hire_date,'yyyymmdd')='20080411' (不使用)
select * from emp where hire_date = to_char('20080411','yyyymmdd') (使用)


4、當被索引的列進行隱式的類型轉換時不會使用索引。如: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),此查詢會走索引。
5、並不是所有情況使用索引都會加快查詢速度,full scan table 有時會更快,尤其是當查詢的數據量佔整個表的比重較大時,因爲full scan table採用的是多塊讀,
當Oracle優化器沒有選擇使用索引時不要立即強制使用,要充分證明使用索引確實查詢更快時再使用強制索引。

6、<>

7、like’�’百分號在前

8、not in ,not exist.
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章