在oracle中,可以利用“select status from user_indexes where index_name=’索引名稱’;”語句判斷索引是否失效;若返回的結(jié)果是VALID,則表示索引沒有失效,否則表示索引失效。
本教程操作環(huán)境:Windows10系統(tǒng)、Oracle 11g版、Dell G3電腦。
oracle怎么判斷索引是否失效
語法如下:
select?status?from?user_indexes?where?index_name='索引名稱';
如果返回結(jié)果為VALID,則表示索引有效!
示例如圖所示:
擴展知識:
索引失效解決方法
1. 選用適合的Oracle優(yōu)化器
Oracle的優(yōu)化器共有3種:
a. RULE (基于規(guī)則) b. COST (基于成本) c. CHOOSE (選擇性)。
設(shè)置缺省的優(yōu)化器,可以通過對init.ora文件中OPTIMIZER_MODE參數(shù)的各種聲明,如RULE,COST,CHOOSE,ALL_ROWS,F(xiàn)IRST_ROWS 。你當(dāng)然也在sql句級或是會話(Session)級對其進(jìn)行覆蓋。
為了使用基于成本的優(yōu)化器(CBO, Cost-Based Optimizer) , 你必須經(jīng)常運行analyze 命令,以增加數(shù)據(jù)庫中的對象統(tǒng)計信息(Object statistics)的準(zhǔn)確性。
如果數(shù)據(jù)庫的優(yōu)化器模式設(shè)置為選擇性(CHOOSE),那么實際的優(yōu)化器模式將和是否運行過analyze命令有關(guān)。如果table已經(jīng)被analyze過, 優(yōu)化器模式將自動成為CBO , 反之,數(shù)據(jù)庫將采用RULE形式的優(yōu)化器。
(分析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后,發(fā)現(xiàn)是數(shù)據(jù)統(tǒng)計的問題,具體的解決辦法是執(zhí)行以上語句】
在缺省情況下,Oracle采用CHOOSE優(yōu)化器, 為了避免那些不必要的全表掃描(full table scan), 你必須盡量避免使用CHOOSE優(yōu)化器,而直接采用基于規(guī)則或者基于成本的優(yōu)化器。
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是索引名。其執(zhí)行計劃跟測試數(shù)據(jù)庫上一致,都是使用用 ‘RECORD_ENTITYID’ 這個索引,邏輯讀寫同樣為4。
后來經(jīng)過測試,在不加hint的情況下,對該表和兩個索引執(zhí)行analyze 后,同樣也能使用 ‘RECORD_ENTITYID’ 這個索引。但是因為該表更新頗為頻繁,不知道要多久就要再分析一次
推薦教程:《Oracle視頻教程》