`
dw008
  • 浏览: 19930 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

能使 Oracle 索引失效的六大限制条件

 
阅读更多

Oracle 索引的目标是避免全表扫描,提高查询效率,但有些时候却适得其反。

例如一张表中有上百万条数据,对某个字段加了索引,但是查询时性能并没有什么提高,这可能是 oracle 索引失效造成的。oracle 索引有一些限制条件,如果你违反了这些索引限制条件,那么即使你已经加了索引,oracle还是会执行一次全表扫描,查询的性能不会比不加索引有所提高,反而可能由于数据库维护索引的系统开销造成性能更差。下面就是总结的能使 Oracle 索引失效的七大限制条件。

1. 没有 WHERE 子句

2. 使用 IS NULL IS NOT NULL

SELECT ... FROM emp WHERE comm IS NULL; comm 列的索引会失效

3. WHERE 子句中使用函数

如果没有使用基于函数的索引,那么 where 子句中对存在索引的列使用函数时,会使优化器忽略掉这些索引。例如:

select * from staff where trunc(birthdate) = '01-MAY-82';

但是把函数应用在条件上,索引是可以生效的,把上面的语句改成下面的语句,就可以通过索引进行查找。

select * from staff where birthdate < (to_date('01-MAY-82') + 0.9999);

注意:对于 MIN, MAX 函数,Oracle 仍然使用索引。

4. 使用 LIKE ‘%T’ 进行模糊查询

5. WHERE 子句中使用不等于操作

不等于操作包括:<>, !=, NOT colum >= ?, NOT colum <= ?

对于这个限制条件可以通过 OR 替代,例如: colum <> 0  ===>   colum>0 OR colum<0

6. 等于和范围索引不会被合并使用

SELECT emp_id, emp_m, salary_q ... FROM emp WHERE job='manager' AND deptno>10

job deptno 都是非唯一索引,这种条件下 oracle 不会合并索引,它只会使用第一个索引。

7. 比较不匹配数据类型

dept_id是一个varchar2型的字段,在这个字段上有索引,但是下面的语句会执行全表扫描。

select * from dept where dept_id = 900198;

这是因为 oracle 会自动把 where 子句转换成 to_number(dept_id)=900198,相当于使用函数,这样就限制了索引的使用。正确写法如下:

select * from dept where dept_id = '900198';

 

分享到:
评论

相关推荐

    Oracle索引详解

    =`)的查询语句,这可能导致索引失效,从而执行全表扫描。 综上所述,Oracle索引是提升数据库查询性能的重要工具,但它的使用需要根据实际情况进行仔细考量,以平衡其带来的性能提升和额外的维护成本。

    oracle 性能优化 加快查询效率

    - **尽量避免使用复杂的函数**:在WHERE子句中使用函数可能会导致索引失效,从而降低查询效率。 - **表关联优化**:在进行表关联时,推荐使用直接的表关联而不是存在性检查(EXISTS),以减少查询时间和资源消耗。 -...

    Oracle_ziliao.rar_oracle

    3. **避免索引失效**:更新或删除操作可能导致索引失效,需要定期分析和重建索引。 二、SQL优化 1. **编写高效的SQL语句**:避免在WHERE子句中使用否定条件和非谓词,尽量使用JOIN代替子查询,减少嵌套层次。 2. **...

    Oracle查询优化改写技巧与案例

    2. 尽量避免在索引列上使用非等值比较(如LIKE、BETWEEN、IN等),这可能导致索引失效。 案例:`SELECT * FROM table WHERE col LIKE 'value%'`,前缀匹配无法利用索引,应考虑使用全文索引或改写为范围查询。 三...

    Oracle 性能调优向导

    我们需要根据查询模式选择合适的索引类型,如B树索引、位图索引、函数索引等,并注意避免索引失效的情况,如在WHERE子句中使用非前导列或者函数。 四、数据库架构设计 良好的数据库设计能够减少性能瓶颈。这包括...

    oracle性能优化文档

    3. 避免索引失效:定期分析和重建索引,确保其有效性。 四、内存结构优化 1. SGA(System Global Area):包括数据缓冲区缓存、redo日志缓冲区、共享池、PGA(Program Global Area)等,根据系统负载调整各部分大小...

    Oracle数据库日常维护手册.pdf

    #### 六、检查Oracle数据库性能 ##### 6.1 检查数据库的等待事件 - **命令**: `$ select event, total_waits, time_waited from v$system_event order by time_waited desc;` - **解释**: 显示数据库中最常见的等待...

    新版ORACLE 8故障解决手册

    3. SQL查询性能下降:可能是索引失效、统计信息过时或者查询优化器选择不当的执行计划。 4. 数据一致性问题:如事务回滚、死锁或数据损坏。 5. 系统资源瓶颈:CPU、内存、磁盘I/O或网络带宽限制。 三、故障诊断与...

    Oracle SQL性能优化.doc

    #### 二十六、强制索引失效 - **强制不使用索引**:在某些情况下,为了获得更好的性能,可能需要强制不使用某个索引。 #### 二十七、避免在索引列上使用计算 - **避免计算**:如果在索引列上进行了计算,则可能...

    Oracle DBA日常巡检最佳实践

    **5.7 定期做统计分析对于采用Oracle Cost-Based Optimizer的系统,需要定期对数据对象的统计信息进行采集更新,使优化器可以根据准备的信息作出正确的explain plan。** - **目的**:确保Oracle CBO优化器基于最新...

    Oracle初始化参数

    - 如果该值设为`TRUE`,`SYSTEM`权限(如`SELECT ANY TABLE`)将不限制对`SYS`模式下各个对象的访问(Oracle7的行为)。这意味着所有具有`SYSTEM`权限的用户都可以访问`SYS`模式下的所有对象,无论这些用户是否拥有...

    Oracle8i_9i数据库基础

    第一部分 Oracle SQL*PLUS基础 23 第一章 Oracle数据库基础 23 §1.1 理解关系数据库系统(RDBMS) 23 §1.1.1 关系模型 23 §1.1.2 Codd十二法则 24 §1.2 关系数据库系统(RDBMS)的组成 24 §1.2.1 RDBMS 内核 24...

    oracle 优化笔记

    3. **减少函数依赖**:避免在WHERE子句中使用复杂的函数表达式,因为这会导致索引失效。 4. **使用EXISTS而非IN**:当涉及到大量数据时,EXISTS关键字通常比IN更快。 5. **合理使用PARTITION BY**:对于大型表,可以...

    ORACLE数据库日常工作维护知识总结.pdf

    #### 六、检查ORACLE数据库性能 **6.1. 检查数据库的等待事件** - **方法**: 使用 `V$WAITSTAT` 视图来检查数据库的等待事件,帮助定位性能瓶颈。 **6.2. Disk Read最高的SQL语句的获取** - **方法**: 通过查询 ...

    sql语句之降龙十八掌

    "IN"和"OR"可能导致索引失效。若能,尝试将多条件的"OR"改写为UNION ALL,或将"IN"改写为JOIN。 5. **第五掌:尽量去掉"&lt;&gt;"** 使用"&lt;&gt;"可能无法利用索引,改成"NOT = "可能会更好。 6. **第六掌:去掉Where子句...

    优化sql语句执行效率几点注意事项

    例如,尽量避免在WHERE子句中使用NOT操作符,因为它可能导致索引失效。 第三,注意SQL的写法。使用JOIN操作时,确保正确指定JOIN条件,并优先选择小表作为驱动表,以减少数据处理量。此外,避免在SELECT语句中使用*...

    Oracle数据库基础

    ### Oracle数据库基础知识点详解 #### 一、理解关系数据库系统(RDBMS) **1.1 关系模型** - **定义**: 关系模型是数据库的一种逻辑数据模型,它以表格形式展示数据及其之间的关系。 - **特点**: - 表中的每一列...

Global site tag (gtag.js) - Google Analytics