在oracle中,可以利用「select status from user_indexes where index_name='索引名稱';」語句判斷索引是否失效;若傳回的結果是VALID,則表示索引沒有失效,否則表示索引失效。
本教學操作環境:Windows10系統、Oracle 11g版、Dell G3電腦。
語法如下:
select status from user_indexes where index_name='索引名称';
如果傳回結果為VALID,則表示索引有效!
範例如圖所示:
擴充知識:
索引失效解決方法
1. 選用適合的Oracle優化器
Oracle的優化器共有3種:
a. RULE (基於規則) b. COST (基於成本) c. CHOOSE (選擇性)。
設定缺省的優化器,可以透過對init.ora檔案中OPTIMIZER_MODE參數的各種聲明,如RULE,COST,CHOOSE,ALL_ROWS,FIRST_ROWS 。你當然也在SQL句級或是會話(session)級對其進行覆蓋。
為了使用基於成本的優化器(CBO, Cost-Based Optimizer) , 你必須經常運行analyze 命令,以增加數據庫中的對象統計信息(object statistics)的準確性。
如果資料庫的最佳化器模式設定為選擇性(CHOOSE),那麼實際的最佳化器模式將和是否執行過analyze指令有關。如果table已經被analyze過, 最佳化器模式將自動成為CBO , 反之,資料庫將採用RULE形式的最佳化器。
(分析table
analyze table PROD_PARTS compute statistics; ANALYZE TABLE PROD_PARTS COMPUTE STATISTICS FOR ALL INDEXED COLUMNS; analyze table PROD_PARTS compute statistics for table for all indexes for all indexed columns;
)【有一次索引失效之後,請教DBA後,發現是資料統計的問題,具體的解決方法是執行以上語句】
在預設情況下,Oracle採用CHOOSE優化器, 為了避免那些不必要的全表掃描(full table scan), 你必須盡量避免使用CHOOSE優化器,而直接採用基於規則或者基於成本的優化器。
2、重建索引
alter index 索引名 rebuild 【online】
3、強制索引
給該語句加上hint後,強制其使用'RECORD_ENTITYID' 這個索引
sql語句變成這樣
引用
select /*+ index(record,record_entityid) */ * from RECORD where entityId='24' and entityType='blog';
/* index(record,record_entityid) */ 中,index表示強制使用index,record是表名,record_entityid是索引名。其執行計劃跟測試資料庫一致,都是使用用 'RECORD_ENTITYID' 這個索引,邏輯讀寫同樣為4。
後來經過測試,在不加hint的情況下,對該表和兩個索引執行analyze 後,同樣也能使用 'RECORD_ENTITYID' 這個索引。但因為表格更新頗為頻繁,不知道要多久就要再分析一次
推薦教學:《Oracle影片教學》
以上是oracle怎麼判斷索引是否失效的詳細內容。更多資訊請關注PHP中文網其他相關文章!