一、以下的方法会引起索引失效
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' 这个索引。但是因为该表更新颇为频繁,不知道要多久就要再分析一次
分享到:
相关推荐
以下是一些常见的索引无效或未被利用的原因及相应的解决方法: 1. **函数索引**:如果在索引列上使用了函数,例如`TO_CHAR`、`TO_DATE`等,数据库通常不会使用常规索引。为了解决这个问题,可以创建函数索引,将...
### Oracle索引失效的原因及解决方法 在Oracle数据库中,索引是提高查询效率的关键工具之一。然而,在实际的应用过程中,由于多种原因可能会导致索引失效,从而影响系统的性能。本文将详细介绍Oracle索引失效的一些...
当某张表建立时间比较长以及该表频繁的进行插入,更新操作时,将出现索引失效问题。
索引失效可能是由多种原因引起的,理解这些原因并采取适当的预防措施至关重要。 首先,当WHERE子句中的条件筛选出的数据量超过表数据总量的15%时,Oracle的优化器可能会决定不使用索引,因为它认为全表扫描更有效率...
SKIP_UNUSABLE_INDEXES 的使用与索引失效解决方法 SKIP_UNUSABLE_INDEXES 参数是 Oracle 数据库中的一种参数设置,它的主要用途是当索引为可用状态时保证 SQL 的运行,虽然它保证了系统的健壮性,但是有可能系统...
这是因为这些函数改变了列中数据的原始形式,导致索引失效。本文主要讨论如何在面对这种问题时,通过调整查询语句来强制使用索引,从而提高查询效率。 首先,我们来看一个大小写混合的场景。假设有一个名为`ADDRESS...
以下是一些可能导致Oracle执行计划不选择使用索引的原因及其解决策略。 1. **优化器模式设置**:Oracle的优化器根据OPTIMIZER_MODE参数决定最佳的查询执行路径。默认情况下,这可能是ALL_ROWS,它倾向于获取所有行...
3. **数据库索引失效问题**: - 故障描述:当GoldenGate尝试写入数据到目标表时,如果涉及的索引处于不可用状态,会触发ORA-01502错误。 - 解决方法:需要在目标数据库中重建失效的索引,然后重启GoldenGate进程,...
- **索引失效**:当表结构更改或数据异常时,索引可能失效。通过重建索引或重新分析统计信息可解决。 - **索引碎片**:大量插入、删除和更新操作可能导致索引碎片,影响查询性能。定期整理索引以减少碎片。 - **...
2. **性能下降**:Oracle 8数据库性能下降可能是由于索引失效、内存不足或查询优化不当引起的。可以通过监控V$视图(如V$SESSION、V$BUFFER_CACHE、V$SQLAREA等)来分析瓶颈,并采取调整内存分配、重建索引或优化SQL...
- **原因**:这些操作符可能导致索引失效。 - **替代方案**:尝试重构查询以使用`=`, `IN`, 或其他更友好的操作符。 **1.4 避免在WHERE子句中使用OR连接条件** - **问题**:使用OR连接多个条件可能导致索引失效。 ...
### 二、表空间变动的原因及操作 #### 原因: 1. **性能优化**:通过调整表空间可以优化I/O操作,提高系统性能。 2. **磁盘管理**:合理规划磁盘空间,避免单个磁盘空间不足。 3. **数据迁移**:实现数据的物理位置...
3. SQL查询性能下降:可能是索引失效、统计信息过时或者查询优化器选择不当的执行计划。 4. 数据一致性问题:如事务回滚、死锁或数据损坏。 5. 系统资源瓶颈:CPU、内存、磁盘I/O或网络带宽限制。 三、故障诊断与...
理解何时创建和使用索引,以及如何避免索引失效,对于数据库性能优化至关重要。 5. **PL/SQL编程**:PL/SQL是Oracle的内置过程式语言,用于编写存储过程、函数、触发器等数据库脚本。掌握PL/SQL的基本语法,如变量...
- **索引优化**:何时使用索引,何时避免索引,以及索引失效的情况。 - **SQL优化**:通过EXPLAIN PLAN、绑定变量、重写SQL等方式提高查询效率。 4. **存储过程与函数**: - **PL/SQL编程**:编写存储过程、函数...
- **方法**:使用操作系统提供的工具(如Windows的任务管理器或Linux的`ps aux | grep oracle`命令)来检查Oracle服务进程的状态。 **1.8 检查Oracle监听状态** - **目的**:确保监听器正常运行且能够接收客户端...
同时,索引维护也是需要关注的问题,避免过度索引和索引失效。 系统调整则涵盖了硬件配置、内存管理、并发控制等多个层面。比如,调整初始化参数如SGA(System Global Area)、PGA(Program Global Area)的大小,...
1. **Oracle ORA-28001 口令已经失效**:这个错误通常意味着用户的口令已过期或者未被正确设置。解决方法包括修改用户密码,通过`ALTER USER`命令设置新的口令,并可能需要设置口令过期策略。 2. **删除表空间...
4. **数据类型不匹配**:确保比较的双方数据类型一致,避免隐式类型转换带来的索引失效。 5. **LIKE模式匹配**:以通配符开头的LIKE查询通常无法使用索引,可尝试使用反向索引或函数索引优化。 #### 4. 性能调优的...