一、以下的方法会引起索引失效
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' 这个索引。但是因为该表更新颇为频繁,不知道要多久就要再分析一次
分享到:
相关推荐
### Oracle索引失效的原因及解决方法 在Oracle数据库中,索引是提高查询效率的关键工具之一。然而,在实际的应用过程中,由于多种原因可能会导致索引失效,从而影响系统的性能。本文将详细介绍Oracle索引失效的一些...
当某张表建立时间比较长以及该表频繁的进行插入,更新操作时,将出现索引失效问题。
4. **IS NULL 和 IS NOT NULL**:在WHERE子句中直接使用`IS NULL`或`IS NOT NULL`也可能导致索引失效。可以使用`NVL`函数结合函数索引来避免这个问题。 示例: ```sql SELECT * FROM A WHERE NVL(B, C) = C ```...
3. **操作符**:某些操作符如`NOT`、`BETWEEN`、`LIKE`的模糊匹配可能导致索引失效,除非使用了前缀索引或全文索引。 4. **索引选择性**:索引的选择性越高,区分度越大,使用索引的效果越好。如果索引列的值过于...
Oracle数据库索引失效是一个常见的性能问题,它可能导致查询效率降低,影响系统的整体性能。索引失效可能是由多种原因引起的,理解这些原因并采取适当的预防措施至关重要。 首先,当WHERE子句中的条件筛选出的数据...
### Oracle 分区表索引失效的问题 #### 一、全局索引与分区表的关系 **全局索引**(Global Index)是指索引覆盖整个表的所有数据,而不受限于分区边界。这种类型的索引通常用于非分区列或者跨分区查询。 **实验...
4. 避免索引失效的操作:如在索引列上使用NOT操作符、计算表达式或函数,都可能导致索引无法被使用。 六、索引策略 建立索引并不意味着性能必然提高,合理的索引策略应考虑以下几点: 1. 数据分布:根据数据的均匀...
4. 索引失效:如果SQL语句使用全表扫描或不匹配索引的条件,索引可能无法发挥作用。 四、SQL优化 1. 使用EXPLAIN PLAN分析查询计划,理解索引使用情况。 2. 避免在索引列上使用NOT、、!=、BETWEEN、LIKE操作符...
2. **索引失效情况** - `OR`条件中,只有当索引覆盖所有条件时才有效。 - 使用`NOT IN`、`NOT EXISTS`或`<>`可能导致全表扫描。 - `LIKE`操作符前缀匹配可利用索引,但模糊匹配则无法利用。 3. **索引提示(Hint...
本文主要总结了重建Oracle索引的相关知识点。 一、重建索引的前提条件 当表上的数据频繁进行`UPDATE`和`DELETE`操作,或者执行了`ALTER TABLE ... MOVE`操作导致ROWID改变时,可能需要考虑重建索引。这些操作可能...
Oracle数据库中的索引是提升查询性能的关键因素,但设计和管理索引也需要...总之,Oracle索引设计是一个平衡查询速度和DML操作成本的过程。理解并应用上述原则可以帮助我们创建和优化数据库性能,提供更高效的服务。
以下是关于Oracle分区索引失效和重建的一些关键知识点: 1. **分区表的创建**: 在示例中,创建了一个名为`T_PART`的分区表,根据`OBJECT_ID`字段的值范围进行分区。`PARTITION BY RANGE`语句定义了不同分区的边界...
导致索引失效: 1、表上频繁发生update,delete操作; 2、表上发生了alter table ..move操作(move操作导致了rowid变化)。
=`)的查询语句,这可能导致索引失效,从而执行全表扫描。 综上所述,Oracle索引是提升数据库查询性能的重要工具,但它的使用需要根据实际情况进行仔细考量,以平衡其带来的性能提升和额外的维护成本。
oracle 时间函数 Oracle 中的时间函数是数据库管理系统中非常重要的一部分,用于处理日期和时间相关的操作。在 Oracle 中,提供了多种时间函数,包括当前日期和时间、上月的首天、末天、本月首天、最后一天、增加...
当涉及到索引失效的问题,需要注意以下几点: 1. 不等于操作符(或!=)通常会导致索引无法使用,可以尝试将其转换为OR条件来利用索引。 2. IS NULL或IS NOT NULL的使用也会限制索引的运用,除非是Bitmap索引,因为...
例如,如果查询姓和名分开存储的员工,使用`first_name || '' '' || last_name = 'Bill Clinton'`会导致索引失效。正确的做法是分别比较`first_name`和`last_name`,即`first_name = 'Bill' AND last_name = '...
**原则三:** 避免在索引列上使用`IS NULL`和`IS NOT NULL`操作,因为这些操作会导致索引失效。当索引列允许NULL值时,ORACLE在处理`IS NULL`或`IS NOT NULL`时无法有效地利用索引。更高效的做法是使用比较运算符,...