网站首页 > 技术文章 正文
有一张表mm_centralpayment_td有800万条数据,有一个状态字段OPSTATUS建有索引IDX16_121501,这个字段取值只有3种:0:未处理;1:处理完成;z:处理出错。表中的数据大部分都是状态1,小部分是状态0,只有极少数(甚至没有)数据是状态z。
现在有一个定时任务,每分钟会去检查是否有出错的记录, SQL内容如下:
select *
from bpsf.mm_centralpayment_td a
where a.opstatus = 'z';
结果这个SQL经常查出来结果为空,但是每次执行还是要8秒,看执行计划可以发现,这个SQL并没有走索引,而是走了全表扫描。
于是我们让SQL强制走索引:
select /*+INDEX(a IDX16_121501)*/
*
from bpsf.mm_centralpayment_td a
where a.opstatus = 'z'
结果这个SQL只要0.5秒,执行计划如下:
为什么明明走索引会更快的SQL,ORACLE没有自动走索引呢?其实从执行计划的cost可以看出表面的原因:
第1个SQL全表扫描,总的cost为88039,
第2个SQL走索引,总的cost为170674,
这个SQL走索引cost更高,所以ORACLE没有选择走索引,而是选择了全表扫描。
深层次的原因是因为ORACLE不会记录每个值对应的记录数量,但是会记录表的记录数量级和字段取值的数量级,比如上面的表的记录数量为百万级,字段取值数量为个位数,平均下来每个取值对应的记录数量至少会有几十万,所以ORACLE觉得平均来看,全表扫描会更快。
比如上面的SQL中如果条件改为状态等于1,ORACLE还是会选择全表扫描,这时查出全部数据的速度,就会比走索引快得多。当然这个我没有实测,因为大部分的数据状态都为1,查出近800万数据一是时间会很长,二是客户端也会内存溢出。
由上面的分析我们可以知道,1个字段的值重复度很高时(记录多,取值少),ORACLE就不会选择走相应的索引,但是如果我们知道某个取值的记录很少,就可以通过强制走索引来提高查询的效率。
- 上一篇: 云贝教育 |【技术文章】oracle索引分裂
- 下一篇: Oracle 索引是一种单独的物理结构
猜你喜欢
- 2024-11-10 详解Oracle数据库is null和is not null在索引上的区别
- 2024-11-10 Oracle中会产生索引抑制的几种情况
- 2024-11-10 Oracle 分区表之相关陷阱 oracle分区表的缺点
- 2024-11-10 玩dotNetCore及EF6失败还是聊下Oracle索引吧
- 2024-11-10 如何“破解”Oracle数据库性能测试过程中索引使用问题?
- 2024-11-10 SQL查询慢,是因为没用对索引 sql语句查询慢 从哪些方面分析
- 2024-11-10 在Oracle中,索引有什么优点和缺点?
- 2024-11-10 Oracle 数据库索引扫描方式 oracle数据库索引查询
- 2024-11-10 Oracle 分区索引类型简述 oracle分区表索引是否失效
- 2024-11-10 Oracle 索引是一种单独的物理结构
你 发表评论:
欢迎- 616℃几个Oracle空值处理函数 oracle处理null值的函数
- 609℃Oracle分析函数之Lag和Lead()使用
- 597℃0497-如何将Kerberos的CDH6.1从Oracle JDK 1.8迁移至OpenJDK 1.8
- 593℃Oracle数据库的单、多行函数 oracle执行多个sql语句
- 590℃Oracle 12c PDB迁移(一) oracle迁移到oceanbase
- 581℃【数据统计分析】详解Oracle分组函数之CUBE
- 570℃最佳实践 | 提效 47 倍,制造业生产 Oracle 迁移替换
- 560℃Oracle有哪些常见的函数? oracle中常用的函数
- 最近发表
-
- PageHelper - 最方便的 MyBatis 分页插件
- 面试二:pagehelper是怎么实现分页的,
- MyBatis如何实现分页查询?(mybatis-plus分页查询)
- SpringBoot 各种分页查询方式详解(全网最全)
- 如何在Linux上运行exe文件,怎么用linux运行windows软件
- 快速了解hive(快速了解美国50个州)
- Python 中的 pyodbc 库(pydbclib)
- Linux搭建Weblogic集群(linux weblogic部署项目步骤)
- 「DM专栏」DMDSC共享集群之部署(一)——共享存储配置
- 故障分析 | MySQL 派生表优化(mysql pipe)
- 标签列表
-
- 前端设计模式 (75)
- 前端性能优化 (51)
- 前端模板 (66)
- 前端跨域 (52)
- 前端缓存 (63)
- 前端aes加密 (58)
- 前端脚手架 (56)
- 前端md5加密 (54)
- 前端路由 (61)
- 前端数组 (73)
- 前端js面试题 (50)
- 前端定时器 (59)
- 前端获取当前时间 (50)
- Oracle RAC (76)
- oracle恢复 (77)
- oracle 删除表 (52)
- oracle 用户名 (80)
- oracle 工具 (55)
- oracle 内存 (55)
- oracle 导出表 (62)
- oracle约束 (54)
- oracle 中文 (51)
- oracle链接 (54)
- oracle的函数 (58)
- 前端调试 (52)
本文暂时没有评论,来添加一个吧(●'◡'●)