原文1:https://blog.csdn.net/u012255097/article/details/102792683

原文2:https://www.cnblogs.com/lanseyitai1224/p/9217177.html

创建Oracle 索引的目的是为了避免全表扫描数据,提高查询效率,但是如果sql语句写的不好致使索引失效,反而会影响数据查询效率。以下几种情况就会导致索引失效:

0.没有 WHERE 子句

众所周知,添加索引的字段必需要在where条件后适当使用才会生效,如果连查询条件都没有,那肯定不会用到索引的。

1.隐式转换导致索引失效.这一点应当引起重视.也是开发中经常会犯的错误。

dept_id 是一个varchar2型的字段,但在查询时把该字段作为number类型以where条件传给Oracle,这样会导致索引失效。

select * from temp where dept_id = 33333333333 ; //错误的例子

select * from temp where dept_id ='33333333333'; //正确的例子

原因:oracle 会自动把 where 子句转换成 to_number(dept_id)=33333333333,相当于使用函数,这样就限制了索引的使用。

2.使用 IS NULL 和 IS NOT NULL

select * from  emp  where colnum   is  null;  //使用 IS NULL后,colnum列的索引会失效

3.WHERE 子句中使用函数不规范

3.1转变一下:

如果没有使用基于函数的索引,那么 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 仍然使用索引。

3.2基于函数的索引:

使用Oracle内部函数导致索引失效.对于这样情况应当创建基于函数的索引.

  错误的例子:select * from test where round(id)=10; 说明,此时id的索引已经不起作用了

  正确的例子:首先建立函数索引,create index test_id_fbi_idx on test(round(id));然后 select * from test where  round(id)=10; 这时函数索引起作用了

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

select * from student where name like 'aaa%';    //'aaa%' 会用到索引

select * from student where name like '%aaa';    //'%aaa' 或者 '_aaa' 不会使用索引

5.对索引列进行运算导致索引失效,我所指的对索引列进行运算包括(+,-,*,/,! 等)

select * from test where id-1=9;  //错误的例子
select * from test where id=10; //正确的例子

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

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

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

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

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

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

8. 不要在 SQL 代码中使用双引号。

因为字符常量使用单引号。如果没有必要限定对象名称,可以使用(非 ANSI SQL 标准)括号将名称括起来。

9. 将索引所在表空间和数据所在表空间分别设于不同的磁盘chunk上,有助于提高索引查询的效率。

10. Oracle默认使用的基于代价的SQL优化器(CBO)非常依赖于统计信息,一旦统计信息不正常,会导致数 据库查询时不使用索引或使用错误的索引。

一般来说,Oracle的自动任务里面会包含更新统计信息的语句,但如果表数据发生了比较大的变化(超过 20%),可以考虑立即手动更新统计信息,

例如:analyze table abc compute statistics,但注意,更新统计 信息比较耗费系统资源,建议在系统空闲时执行。

11. Oracle在进行一次查询时,一般对一个表只会使用一个索引。

因此,有时候过多的索引可能导致Oracle使用错误的索引,降低查询效率。例如某表有索引1(Policyno) 和索引2( classcode),

如果查询条件为 policyno=‘xx’ and classcode=‘xx’,则系统有可能会使用索引2,相较于使用索引1,查询效率明显降低。

12. 优先且尽可能使用分区索引。

oracle数据库中索引失效的几种情况的更多相关文章

  1. MySQL索引失效的几种情况

    1.索引不存储null值 更准确的说,单列索引不存储null值,复合索引不存储全为null的值.索引不能存储Null,所以对这列采用is null条件时,因为索引上根本 没Null值,不能利用到索引, ...

  2. mysql索引总结(4)-MySQL索引失效的几种情况

    mysql索引总结(1)-mysql 索引类型以及创建 mysql索引总结(2)-MySQL聚簇索引和非聚簇索引 mysql索引总结(3)-MySQL聚簇索引和非聚簇索引 mysql索引总结(4)-M ...

  3. Oracle 分区表中索引失效

    当对分区表进行 一些操作时,会造成索引失效. 当有truncate/drop/exchange 操作分区  时全局索引 会失效. exchange 的临时表没有索引,或者有索引,没有用includin ...

  4. Oracle数据库表索引失效,解决办法:修改Oracle数据库优化器模式

    ALTER SYSTEM SET OPTIMIZER_MODE=RULE scope=both; 其他可以选择的模式还有ALL_ROWS/CHOOSE/FIRST_ROWS/ALL_ROWS. 应用系 ...

  5. 通过exp命令对Oracle数据库进行备份操作(提供两种情况的备份:备份本地,备份远程的数据库)

    exp 用户名/密码@数据库所在ip地址:数据库端口号/数据库的service-name file=存储到的位置 这个是能成功的 http://www.2cto.com/database/201402 ...

  6. mysql 索引失效的几种情况+

  7. 查找Oracle数据库中的重复记录

    本文介绍了几种快速查找ORACLE数据库中的重复记录的方法. 下面以表table_name为例,介绍三种不同的方法来确定库表中重复的记录 方法1:利用分组函数查找表中的重复行:按照某个字段分组,找出行 ...

  8. (面试题)如何查找Oracle数据库中的重复记录

    今天做了个面试题:查找Oracle数据库中的重复记录,下面详细介绍其他方法(参考其他资料) 本文介绍了几种快速查找ORACLE数据库中的重复记录的方法. 下面以表table_name为例,介绍三种不同 ...

  9. Oracle数据库中如何选择合适的索引类型 .

    索引就好象一本字典的目录.凭借字典的目录,我们可以非常迅速的找到我们所需要的条目.数据库也是如此.凭借Oracle数据库的索引,相关语句可以迅速的定位记录的位置,而不必去定位整个表. 虽然说,在表中是 ...

随机推荐

  1. .NET Core加解密实战系列之——使用BouncyCastle制作p12(.pfx)数字证书

    简介 加解密现状,编写此系列文章的背景: 需要考虑系统环境兼容性问题(Linux.Windows) 语言互通问题(如C#.Java等)(加解密本质上没有语言之分,所以原则上不存在互通性问题) 网上资料 ...

  2. UOS服务器常见问题

    UOS服务器安装完成之后,xshell工具无法远程, 描述 我安装完系统后,用xshell工具无法远程,必须在系统上才能进去我是通过centos7的kvm虚拟工具上刷的统信的系统,安装方式: 最小化安 ...

  3. zabbbixs数据库常用操作

    设置MariaDB数据库远程 GRANT ALL PRIVILEGES ON *.* TO 'root'@'%'IDENTIFIED BY 'admin' WITH GRANT OPTION; SEL ...

  4. 关于人人开源renren-fast-vue 中npm install各种报错的解决方案

    首先吐槽一下,因为这个问题我整了好几天,把报错信息复制百度,试遍了各种方法,node.js我是卸载了安装,安装了卸载,甚至renren-fast-vue我也删了再下,然后再删,无限循环.然而没有什么软 ...

  5. 图片压缩工具pngquant

    关于图片压缩的,之前看到一个imageOptim,用着不错,也挺好用的,直接打开要压缩的图片或者文件夹,唰唰唰的就开始压缩了,如下图 后来觉得不是很方面,还要打开软件,选择文件夹,然后就又研究了一下, ...

  6. python数据结构实现(栈和链栈)

    栈 class Stack: def __init__(self, limit: int 10): self.stack = [] self.limit = limit def __bool__(se ...

  7. Vue登录注册,并保持登录状态

    关于vue登录注册,并保持登录状态,是vue玩家必经之路,网上也有很多的解决方法,但是有一些太过于复杂,新手可能会看的一脸懵逼,现在给大家介绍一种我自己写项目在用而且并不难理解的一种方法. 项目中有一 ...

  8. NoActionBar主题下如何添加OptionsMenu

    菜单无法显示 为了不显示标题栏,所以主题使用了 NoActionBar,这也直接导致选项菜单无处显示 解决方案 添加一个ToolBar,自定义标题栏 <androidx.appcompat.wi ...

  9. Solon详解(九)- 渲染控制之定制统一的接口输出

    Solon详解系列文章: Solon详解(一)- 快速入门 Solon详解(二)- Solon的核心 Solon详解(三)- Solon的web开发 Solon详解(四)- Solon的事务传播机制 ...

  10. linux_基础调优

    1. 配置授时服务,使用阿里云的授时服务 echo -e "# update time\n*/5 * * * * /usr/sbin/ntpdate time1.aliyun.com &am ...