数据库中索引会失效的几种情况(oracle)

2023-11-18

数据库中索引会失效的几种情况(oracle)

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

1. 没有 WHERE 子句

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

2. 使用 IS NULL 和 IS NOT NULL

--colnum列的索引会失效
select *
from  emp  
where colnum is null;  

--colnum列的索引会失效
select *
from  emp  
where colnum is not null;  

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’ 进行模糊查询

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

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

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

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

对于这个限制条件可以通过 OR 替代,例如: colum <> 0 我们可以改写成 colum>0 OR colum<0

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

SELECT * FROM emp 
WHERE job='manager' 
AND deptno>10

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

7. 比较不匹配数据类型

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

select * from temp where dept_id = 100101;

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

select * from temp where dept_id = '100101';

8. 复合索引,不是使用的第一部分

假设现在有索引如下:

--以下复合索引,name是第一部分(左边的列),age不是第一部分(右边的列) 
alter table student add index my_index(name, age)   

此时

--会用到索引
select * from student where name = 'aaa'    


--不会使用索引
select * from student where age = 18          

9. or语句其中一个条件没有使用索引

假设现在我们有索引如下:

alter table student add index my_index(name)   

以下搜索语句将不会使用索引:

--由于age并没有创建索引,因此该语句索引失效
select * from student
where name = '张三'
or age = 18

转载自:
https://blog.csdn.net/u012255097/article/details/102792683
https://blog.csdn.net/dummyo/article/details/84194086

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数据库中索引会失效的几种情况(oracle) 的相关文章

随机推荐

  • Python(4)list和tuple(类似js里的数组)

    6 list list其实就是js里的数组 放置在中括号里 用逗号分隔 就是数组的元素 例如 foo 1 2 3 print foo 1 2 3 len 访问list的长度 foo 1 2 3 print len foo 3 list n
  • 二叉树层次遍历的相关应用(伪代码)

    1 层次遍历 void LevelOrder BTree t Queue Q initQueue Q EnQueue Q t while Empty Q TNode p DeQueue Q if p gt lchird EnQueue Q
  • Redis主从复制(读写分离)、哨兵(主从切换)配置

    Redis的主从复制功能非常强大 一个master可以拥有多个slave 而一个slave又可以拥有多个slave 如此下去 形成了强大的多级服务器集群架构 官网 https redis io 环境 Master root Master u
  • Java架构直通车——ThreadLocal实现RabbitMQ消息的批量发送

    文章目录 引入 什么是ThreadLocal 使用ThreadLocal 引入 之前 我们完成了单个消息的发送 以及单个消息发送的多线程池化 这里 我们继续完成批量发送消息的封装 因为rabbitMq本身是不支持批量发消息的 所以我们可以直
  • Ubuntu 20.04安装配置opencv4.2.0及踩坑

    Ubuntu 20 04安装配置opencv4 2 0及踩坑 所需各种文件链接在此 链接 https pan baidu com s 1kf cljseuUbq7MqzBg TQw 提取码 ooh2 一 在安装配置opencv之前如果没换源
  • spacemacs创建layer

    m x configuration layer create layer 选择目录 默认是private 然后命名layername 比如my 在 spacemacs文件里 增加my到layer list里 在private my pack
  • 马踏棋盘算法(骑士周游问题)

    将马随机放在国际象棋的8 8棋盘的某个方格中 马按走棋规则进行移动 要求每个方格只进入一次 走遍棋盘上全部64个方格 代码 include stdafx h include
  • HackPorts – Mac OS X 渗透测试框架与工具

    HackPorts是一个OS X 下的一个渗透框架 HackPorts是一个 超级工程 充分利用现有的代码移植工作 安全专业人员现在可以使用数以百计的渗透工具在Mac系统中 而不需要虚拟机 工具列表 0trace 3proxy Air Au
  • 调用 matlab的function函数出现未定义函数的现象

    调用 matlab的function函数出现未定义函数的现象 将matlab的默认位置 C Users Administrator Desktop 改为当前文件所在位置即可 具体参考 链接 https blog csdn net wzgl
  • 2019-12-28

    c语言 入门级别代码解一元二次方程 其实实现输入a b c解出x的值并不难 首先我们先要了解一元二次方程的解法 将步骤一步步套入程序 include
  • SpringSecurity一日干

    前后端登录校验的逻辑 完整流程 本质就是过滤器链 1 提交用户名和密码 2 将提交的信息封装Authentication对象 3 传给下一个 调用2中的authenticate方法进行验证 4 3步骤也验证不了需要调用3的authentic
  • 【计算机组成原理】总线宽度和总线带宽的区别,总线带宽的计算

    总线宽度 总线的宽度 指总线在单位时间内可以传输的数据总数 即平常说的32位 64位 总线宽度 总线位宽 数据线的根数 总线带宽 总线带宽 指总线在单位时间内可以传输的数据总数 等于总线的宽度与工作频率的乘积 通常单位 MB s MBps
  • vscode修改插件的安装的位置,从c盘转移到其他盘

    作为一个电脑非常落后的人 c盘每MB位置都很珍贵 能安装到别的盘的就尽量安装到其他盘 首先在c盘找到 vscode文件 下面的extensions文件就是插件放置的位置 将extensions里的文件全部剪切到自己定义的位置下 原来的ext
  • Quartz 体系结构

    Quartz的体系结构 Quartz的重要组件 Scheduler 用于与调度程序交互的主程序接口 Scheduler调度程序 任务执行计划表 只有安排进执行计划的任务Job 通过scheduler scheduleJob方法安排进执行计划
  • TFT-LCD显示屏工作原理图文解析

    一直很好奇手机屏幕的显示原理 这是LCD的 OLED 屏幕的与此不同 直接贴上原文链接 http www 58display com article zixun 208 html 以下是复制的原文 液晶显示器是什么 不同的应用环境 有不同的
  • C++-对四个智能指针:shared_ptr,unique_ptr,weak_ptr,auto_ptr的理解

    回答如下 C 的智能指针是一种特殊类型的 指针 其主要目的是自动跟踪内存分配和释放 以避免程序中出现内存泄露或空悬指针等问题 主要采用的技术是 借助于类的生命周期 当超出了类的作用域时 类对象会自动调用析构函数 然后就可以释放内存等资源 无
  • Mac M1安装Homebrew 简单实用

    1 首先创建安装目录 sudo mkdir p opt homebrew 2 将目录属主修改为当前用户 方便直接实用brew install sudo chown R whoami opt homebrew 3 进入 opt文件夹 cd o
  • 第08章 Spring-Boot 使用简介

    第08章 Spring Boot 简介 Spring框架功能很强大 但是就算是一个很简单的项目 我们也要配置很多东西 因此就有了Spring Boot框架 它的作用很简单 就是帮我们自动配置 Spring Boot框架的核心就是自动配置 只
  • 轻量级自动化测试框架WebZ

    一 什么是WebZ WebZ是我用Python写的 关键字驱动 的自动化测试框架 基于WebDriver 设计该框架的初衷是 用自动化测试让测试人员从一些简单却重复的测试中解放出来 之所以用 关键字驱动 模式是因为我觉得这样能让测试人员 测
  • 数据库中索引会失效的几种情况(oracle)

    文章目录 数据库中索引会失效的几种情况 oracle 1 没有 WHERE 子句 2 使用 IS NULL 和 IS NOT NULL 3 WHERE 子句中使用函数 4 使用 LIKE T 进行模糊查询 5 WHERE 子句中使用不等于操