转自:http://liusuper.iteye.com/blog/219013 谢谢
oracle的索引陷阱
一个表中有几百万条数据,对某个字段加了索引,但是查询时性能并没有什么提高,这主要可能是oracle的索引限制造成的。
oracle的索引有一些索引限制,在这些索引限制发生的情况下,即使已经加了索引,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';
分享到:
相关推荐
在“小菜鸟系列-Oracle的索引”中,我们将深入探讨Oracle数据库中的索引原理、类型以及如何有效地利用它们优化查询性能。 首先,索引是一种特殊的数据结构,它为数据库表中的数据提供快速访问路径。就像书的目录...
在“小菜鸟系列-Oracle的优化器与hint”这个主题中,我们将深入探讨Oracle数据库的查询优化器以及如何通过使用hint来引导优化器进行更高效的执行计划选择。 Oracle的优化器是数据库引擎的核心组件,它负责分析SQL...
这份“最牛逼的Oracle DBA基础笔记”显然是为初学者准备的,旨在帮助菜鸟快速掌握Oracle数据库管理的基础知识。Oracle数据库是全球广泛使用的大型企业级数据库管理系统,尤其在金融、电信、医疗等行业有着广泛应用。...
#### 6. 数据备份与恢复 - **备份策略**:制定合理的备份计划,包括全备、增量备份等。 - **恢复操作**:当数据库发生故障时,利用备份文件进行恢复操作,包括完全恢复和不完全恢复等。 ### 性能调优 #### 7. SQL...
oracle 索引学习,包括如何创建索引,如何利用索引来优化数据库,使数据库更加快. 是菜鸟学习的好书
### 超详细Oracle教程知识点总结 #### 一、引言 - **SUN与Oracle合并背景**:2009年,Oracle宣布以74亿美元收购SUN Microsystems,此举被视为Oracle迈向云计算的重要一步。 - **云计算核心价值**:随着云计算在企业...
这个“Oracle 11g从入门到熟练再到精通”教程是为初学者设计的,旨在帮助菜鸟级别的学习者掌握Oracle数据库的核心概念、管理和操作技能。 一、Oracle 11g基础 1. 数据库概念:理解数据库的基本概念,如数据模型...
2. **索引**:Oracle支持多种类型的索引,如B树索引、位图索引、函数索引等,以提高查询性能。 3. **分区**:Oracle的分区功能允许大型表被分割成更小、更易管理的部分,提高查询速度和维护效率。 4. **游标**:在...
Oracle数据库系统是全球广泛使用的大型关系型数据库管理系统之一,它在企业级数据管理、数据分析以及高性能计算中扮演着重要角色。对于想要从入门到精通Oracle的读者来说,这份资源将是一份宝贵的指南。 首先,...
《张立国oracle数据库教程》是一份全面介绍Oracle数据库系统的教育资源,由知名专家张立国精心编撰。这个教程共分为六个章节,旨在帮助初学者和有经验的IT专业人士深入理解Oracle数据库的核心概念和技术。 第一章...
Oracle存储过程是数据库管理系统Oracle中的一个重要特性,它允许开发者编写一系列复杂的SQL和PL/SQL语句,形成可重用的代码模块。这个超详细使用手册和详细讲解将深入探讨存储过程的概念、创建、调用、优化及其在...
1. **数据库结构迁移**:该工具能够将Access数据库的表结构,包括字段、索引、关系等完整地迁移到Oracle数据库中。这意味着用户无需手动创建Oracle中的表结构,大大节省了时间和工作量。 2. **数据迁移**:除了结构...
配合PL/SQL Developer,这是一款强大的Oracle数据库管理和开发工具,用户可以编写、调试、执行PL/SQL代码,管理表、索引、存储过程等数据库对象,以及进行数据导入导出等操作。有了这个精简版的Oracle客户端,用户...
Oracle DBA(Database Administrator,数据库管理员)是负责管理和维护Oracle数据库系统的专家。Oracle数据库是全球广泛使用的商业级关系型数据库管理系统之一,它提供了强大的数据存储、处理和管理能力。本教程...
6. **备份与恢复**:数据的安全性至关重要,因此学习Oracle的备份策略和恢复技术至关重要。这包括冷备份、热备份、逻辑备份,以及RMAN(Recovery Manager)的使用。 7. **性能优化**:Oracle提供了许多工具和技巧来...
Oracle数据库中数据类型的存储方式是数据库管理的基础知识之一,了解这一点对于进行数据设计和应用开发至关重要。Oracle数据库支持多种数据类型,包括数值型、字符型、日期时间型和LOB等大对象数据类型,每种数据...
Oracle 表分区的用途是当表中数据量不断增大,查询速度变慢,应用程序的性能下降时,通过分区将表、索引或索引组织表进一步细分为段,减少数据库的负担,缩短查询时间。 二、数据库分库分表思路 数据库分库分表是...
可能涉及数据库备份与恢复策略,Oracle提供的RMAN( Recovery Manager)工具,或者如何进行数据库性能优化,如分析和调整SQL查询,使用索引,以及管理表空间和数据段。还可能讨论到数据库安全性,如用户权限管理,...
本课程中重点讲解了关于oracle数据库的相关知识,包含但不限于,Oracle的基本概念,Oracle数据库的创建以及维护,oracle数据库表的创建以及维护,查询和视图详解,索引和权限详解,以及备份和还原,plsql的基础语法...