精选文章 分享知识-快乐自己:能使 Oracle 索引失效的六大限制条件

分享知识-快乐自己:能使 Oracle 索引失效的六大限制条件

作者:andymmm0925 时间: 2021-02-07 01:32:56
andymmm0925 2021-02-07 01:32:56
【摘要】Oracle 索引的目标是避免全表扫描,提高查询效率,但有些时候却适得其反。 
 例如一张表中有上百万条数据,对某个字段加了索引,但是查询时性能并没有什么提高,这可能是 oracle 索引失效造成的。oracle 索引有一些限制条件,如果你违反了这些索引限制条件,那么即使你已经加了索引,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';

转载于:https://www.cnblogs.com/mlq2017/p/10309413.html

勿删,copyright占位
分享文章到微博
分享文章到朋友圈

上一篇:【成都首脑智能家居】购买智能家居需要注意的六个地方?

下一篇:麻省理工公开课:线性代数 第8课 求解Ax=b:可解性和解的结构

您可能感兴趣

  • 如何在你的Linux机器上安装运行Oracle

    如何在你的Linux机器上安装运行Oracle发布者:netbullLinuxByte注:本站有Oracle最新版本下载! 摘要:Oracle于去年年底宣布移植Oracle 8和Oracle Application Server到Linux。 这是一个明确无误的标志:整个世界都应该认识到,Linux已经是一个严肃的操作系统,足以承担企业级的应用。 Uche Ogbuji在下文中解释了应该如何...

  • Linux下Oracle安装宝典

    Linux下Oracle安装宝典 2001-01-17 12:19发布者:netbullLinuxByte注:本站有Oracle最新版本下载 作者:李鲲程   笔者用的是Linux版的Oracle V8.1.6,安装在RedHat Linux 6.0上。 Oracle的安装包括企业版服务器端和客户端两部分,用户可以根据实际情况选择不同的部分安装。 这里以企业版服务器端为主要介绍对象,...

  • Digital Unix Version 4.0下Oracle 8.0.5服务器的安装

    Digital Unix Version 4.0下Oracle 8.0.5服务器的安装 石骁騑(中软网络技术股份有限公司,北京,100081) 一、 系统需求在安装Oracle 8 服务器前,首先检查系统是否满足表1和表2所示的软硬件需求。1. 硬件需求 表1 硬件需求硬件项目 需求CPU Digital Unix alpha 系统内存 最少128M RAM交换空间 2-4倍的内存大小磁盘驱...

  • 操作系统原理知识“妙”问“趣”答

    bear看着觉得好玩,又有点料,就贴上来赚参与分了   操作系统原理知识“妙”问“趣”答 http://tech.sina.com.cn 2000/11/16 16:27 新浪科技论坛 新浪网友:小宝宝乖   序   我们每天都同操作系统打交道,了解一些操作系统原理上的知识是绝对有必要的,它可以让你了解操作系统内部是怎么工作的,为什么会出现这样那样的问题,为我们解决这些问题提供思路。   本...

  • 用VB“破解”有时间限制的程序

    用VB“破解”有时间限制的程序张 胜 你是否经常遇到有时间限制的程序?我等懒人尤其对此特别反感,可惜囊中羞涩,只好反复修改其系统日期而使自己多用几次此软件——实在是辛苦!于是使用“Anyday32”,可惜也太麻烦了;再后使用“时光倒流”,也不好用,而且——居然还有Bugs!......

  • C#重点知识详解(二)

    第二章 内存管理 c#内存管理提供了与java一样的自动内存管理功能,让程序员从繁重的内存管理中摆脱出来,内存管理提高了代码的质量和提高了开发效率。 c#限制了着指针的使用,免除了程序员对内存泄漏的烦恼,但是不是意味着向java程序员一样c#程序员在也不能使用指针代来的好处。微软在设计C#语言时考虑到这个问题,在一方面抛弃指针的同时,另一方面采用折衷的办法,通过一个标志来时程序引入指针。 首...

  • c#重点知识详解(三)

    第三章: 类属性使用过RAD开发工具的一定inspector很熟悉,程序员通过它可以操作对象的属性,DELPHI中引入了PUBLISH关键字来公布对象属性受到程序员的普遍欢迎.通过存取标志来访问private成员,在c#中有两种途径揭示类的命名属性——通过域成员或者通过属性。前者是作为具有公共访问性的成员变量而被实现的;后者并不直接回应存储位置,只是通过存取标志(accessors)被访问。...

  • c#语言重点知识详解(四:加框与解框)

    第四章:C# 中的加框与去框 C# 运行时中有两种类型:引用类型(reference)(在 C# 中用类声明)和值类型(value)(在 C# 中用结构声明)。引用和值类型在几个重要方面有所不同。值类型“感觉上”象一个数据。它包括预定义数值类型(如int、bool)以及用户定义的类型(circle、Point等)。如上文所述,值类型的变量是实际的值,所以在您使用变量时,通常处理的是实际的值。...

CSDN

CSDN

中国开发者社区CSDN (Chinese Software Developer Network) 创立于1999年,致力为中国开发者提供知识传播、在线学习、职业发展等全生命周期服务。

华为云40多款云服务产品0元试用活动

免费套餐,马上领取!
分享知识-快乐自己:能使 Oracle 索引失效的六大限制条件介绍:华为云为您免费提供分享知识-快乐自己:能使 Oracle 索引失效的六大限制条件在博客、论坛、帮助中心等栏目的相关文章,同时还可以通过 站内搜索 查询更多分享知识-快乐自己:能使 Oracle 索引失效的六大限制条件的相关内容。| 移动地址: 分享知识-快乐自己:能使 Oracle 索引失效的六大限制条件 | 写博客