oracle 索引-1无效,oracle 索引失效原因及解決方法

本文详细列举了导致数据库索引失效的多种情况,包括不规范的查询语法、未分析表、运算符使用不当等,并提供了相应的解决办法,如选择合适的优化器、重建索引和强制使用索引等。同时强调了数据统计准确性对于优化器选择的重要性。
摘要由CSDN通过智能技术生成

一、以下的方法會引起索引失效

‍1,<>

2,單獨的>,

3,like "%_" 百分號在前.

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的時候),或者=一個值;

當建立索引的第一位置是=一個值時,其他索引列可以是任何情況(包括is null =一個值),以上兩種情況索引都會走。其他情況不會走。

二、索引失效解決方法

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' 這個索引。但是因為該表更新頗為頻繁,不知道要多久就要再分析一次

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值