【轉】Oracle索引失效問題

轉自:http://www.cnblogs.com/millen/archive/2010/01/18/1650423.html

失效狀況分析:

  1. <>
  2. 單獨的>,<,(有時會用到,有時不會)
  3. like "%_" 百分號在前.(可採用在創建索引時用reverse(columnName)這種方法處理)
  4. 表沒分析.
  5. 單獨引用複合索引裏非第一位置的索引列.
  6. 字符型字段爲數字時在where條件裏不添加引號.
  7. 對索引列進行運算.須要創建函數索引.
  8. not in ,not exist.
  9. 當變量採用的是times變量,而表的字段採用的是date變量時.或相反狀況。
  10. 索引失效。
  11. 基於cost成本分析(oracle由於走全表成本會更小):查詢小表,或者返回值大概在10%以上
  12. 有時都考慮到了 但就是不走索引,drop了從建試試在
  13. B-tree索引 is null不會走,is not null會走,位圖索引 is null,is not null  都會走
  14. 聯合索引 is not null 只要在創建的索引列(不分前後)都會走,in null時  必需要和創建索引第一列一塊兒使用,當創建索引第一位置條件是is null 時,其餘創建索引的列能夠是is null(但必須在全部列都知足is null的時候),或者=一個值;
  15. 當創建索引的第一位置是=一個值時,其餘索引列能夠是任何狀況(包括is null =一個值),以上兩種狀況索引都會走。其餘狀況不會走。

 

針對狀況10的處理:

先能夠分析下表,可是分析表的時候會加鎖,這個須要注意。語句以下:html

analyze table table_name compute statisticsoracle

致使的緣由:

在SQL*LOADER 加載過程當中會維護索引,因爲數據量比較大,在SQL*LOADER 加載過程當中出現異常狀況,致使ORACLE 來不及維護索引,致使索引處於失效狀態,影響查詢和加載。
異常狀況主要有:在加載過程當中殺掉SQL*LOADER 進程,重啓,表空間不夠等。函數

查詢索引是否失效主要有如下兩個視圖:spa

select * from dba_indexes t;
select  * from user_indexes;code

解決方法:

重建索引
查看索引類型: 是否分區索引  htm

  1. 非分區索引
  2. 分區索引

重建全部狀態爲unusable的索引,重建腳本:  blog

ALTER INDEX 索引名   
             REBUILD PARTITION 分區名   
             TABLESPACE 表空間名   
            ONLINE  NOLOGGING
相關文章
相關標籤/搜索