`
xiaohlang
  • 浏览: 91036 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

oracle使用索引中的注意事项

阅读更多
1、使用不等于操作符(<>, !=)
下面这种情况,即使在列dept_id有一个索引,查询语句仍然执行一次全表扫描

select * from dept where staff_num <> 1000;

但是开发中的确需要这样的查询,难道没有解决问题的办法了吗?

有!

通过把用 or 语法替代不等号进行查询,就可以使用索引,以避免全表扫描:上面的语句改成下面这样的,就可以使用索引了。


select * from dept shere staff_num < 1000 or dept_id > 1000;

2、使用 is null 或 is not null

使用 is null 或is nuo null也会限制索引的使用,因为数据库并没有定义null值。如果被索引的列中有很多null,就不会使用这个索引(除非索引是一个位图索引,关于位图索引,会在以后的blog文章里做详细解释)。在sql语句中使用null会造成很多麻烦。

解决这个问题的办法就是:建表时把需要索引的列定义为非空(not null)

3、使用函数

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

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

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

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

4、比较不匹配的数据类型

比较不匹配的数据类型也是难于发现的性能问题之一。下面的例子中,dept_id是一个varchar2型的字段,在这个字段上有索引,但是下面的语句会执行全表扫描。

select * from dept where dept_id = 900198;

这是因为oracle会自动把where子句转换成to_number(dept_id)=900198,就是3所说的情况,这样就限制了索引的使用。把sql语句改为如下形式就可以使用索引

select * from dept where dept_id = '900198';

5、使用like子句

使用like子句查询时,数据需要把所有的记录都遍历来进行判断,索引不能发挥作用,这种情况也要尽量避免。



查看国外网站介绍,其实影响使用索引的操作符有如下这些:

"IS NULL", "<>", "!=", "!>", "!<", "NOT", "NOT EXISTS", "NOT IN", "NOT LIKE", and "LIKE '%500'"


实际测试中发现"IN" 不包括在内,NOT IN 确实很慢。

原文如下:http://www.orafaq.com/node/1918

分享到:
评论

相关推荐

    Oracle 创建索引的基本规则

    创建B-Tree索引的注意事项** - **WHERE子句**: 当WHERE子句包含索引列时,Oracle会优先使用该索引。 - **组合索引**: 如果WHERE子句中有多个条件,可以通过创建组合索引来提高查询效率。 - **查询条件的顺序**: ...

    oracle约束和索引笔记

    **使用和维护索引的注意事项:** - 索引会占用额外的存储空间,并且在插入、删除和更新数据时需要维护,这可能会降低写操作的性能。 - 不是所有查询都受益于索引,对于全表扫描或者不使用索引列的查询,索引可能...

    Oracle解决索引碎片功能.txt

    在Oracle中,通常使用`ALTER INDEX`命令来重建索引,从而消除碎片。具体命令格式如下: ```sql ALTER INDEX ind_1 REBUILD [ONLINE] [TABLESPACE name]; ``` - **ind_1**:待重建的索引名称。 - **ONLINE**:表示...

    oracle在线创建索引和重组索引

    下面我们将详细介绍在线创建索引和重组索引的步骤和注意事项。 一、在线创建索引 在线创建索引可以提高查询性能,但是需要评估该索引的必要性和可能对现有语句的影响。如果不是紧急的大索引,最好在维护时间操作。...

    oracle表空间变动注意事项

    本文将详细介绍关于Oracle表空间变动时需要注意的关键点,特别是当进行表空间更改后可能出现的索引问题及相应的解决方案。 ### 一、Oracle表空间的基本概念 在深入探讨表空间变动前,首先需要了解Oracle表空间的...

    Oracle SQL规范与优化注意事项

    以下是一些重要的优化策略和注意事项: 1. **避免语法分析重复**:尽量保持SQL语句的标准化,避免因书写格式不同而进行多次语法分析,这会增加解析开销。 2. **使用绑定变量**:共享SQL语句,使用绑定变量而非常量...

    oracle 创建和删除索引

    #### 一、Oracle索引概述 在Oracle数据库中,索引是一种重要的数据结构,用于提高数据检索速度。通过创建索引,可以显著提升查询性能,尤其是在处理大型数据表时更为明显。索引类似于书籍中的目录,能够帮助数据库...

    Oracle使用强制索引的方法与注意事项

    首先,我们来看如何在Oracle中使用强制索引。在SQL查询中,可以通过在查询提示符中指定`/*+ INDEX */`来强制使用特定的索引。例如: ```sql SELECT /*+ INDEX(t pk_emp) */ * FROM EMP t; ``` 这里的`t`是表的别名...

    ORACLE重建索引总结

    本文主要总结了重建Oracle索引的相关知识点。 一、重建索引的前提条件 当表上的数据频繁进行`UPDATE`和`DELETE`操作,或者执行了`ALTER TABLE ... MOVE`操作导致ROWID改变时,可能需要考虑重建索引。这些操作可能...

    Oracle重构索引

    #### 五、索引重构的注意事项 - **性能考量**:在选择重构方式时,需要考虑当前系统的负载情况,以及是否可以接受索引在一段时间内的不可用状态。 - **磁盘空间**:特别是使用`REBUILD ONLINE`时,可能会需要额外的...

    Oracle为sdo_geometry创建空间索引

    Oracle 中创建空间索引的实现步骤和注意事项 空间索引是 Oracle 中的一种特殊索引类型,用于加速空间数据的查询和检索。空间索引可以大大提高空间数据的查询效率,特别是在处理大量空间数据时。本文将详细介绍如何...

    [Oracle]如何在亿级记录表中创建索引

    #### 五、注意事项 - 在创建索引过程中,应密切关注系统资源使用情况,特别是磁盘空间和CPU使用率。 - 定期对索引进行分析和调整,以保持其有效性。 - 需要考虑索引维护成本,尤其是在有大量写入操作的情况下。 ...

    BLOG_Oracle之不可见索引.pdf

    1.5 注意事项 - 在生产环境中操作索引时需谨慎,尤其是在高并发环境下,应尽量避免对大型索引进行即时的可见性更改,以免引发系统不稳定。 - 创建不可见索引是评估新索引性能的好方法,但在启用之前,务必确保对其...

    MYSQL到ORACLE程序迁移的注意事项

    MySQL到Oracle数据库迁移的过程中,需要注意一系列的差异和调整,以确保迁移后的应用程序能够正常运行。以下是一些关键点的详细说明: 1. **自动增长的数据类型处理**: 在MySQL中,`AUTO_INCREMENT`字段自动分配...

    ORACLE移植DB2注意事项

    ### ORACLE移植DB2注意事项 在进行Oracle到DB2数据库移植的过程中,需要注意多个方面的差异,以确保移植后的应用能够正常运行。以下将详细介绍几个关键点: #### 1. 字符串与数字的区别处理 在Oracle中,如果在...

    Oracle数据库升级注意事项.doc

    在升级Oracle数据库至10g版本时,有几个关键的注意事项和技术亮点值得注意。 首先,Oracle 10g版本的主要目标是降低管理开销并提高性能。在性能与扩展能力方面,新版本对Intel 64位平台提供了支持,增强了对...

Global site tag (gtag.js) - Google Analytics