Oracle SQL语句没有过滤条件,究竟是否会走索引??

答案是:可能走索引也可能不走索引,具体要看列的值可不可为null,Oracle不会为所有列的nullable属性都为Y的sql语句走索引。

例子:

复制代码
create table t as select * from dba_objects;

CREATE INDEX ix_t_name ON t(object_id,  object_name, owner);

SELECT object_id, object_name, owner FROM t;

看到网上很多的文章都会说第三个SQL语句没有where条件,肯定不走索引,或者 说 这个语句的列上都有索引,会走覆盖索引,真的是这样吗?

第三个DQL语句会走索引吗? --不会。因为虽然查询的这三个列都被覆盖索引包含在内,但这三个列都可为null,正如开篇所说------Oracle不会为全都为null的行走索引。执行计划如下:

可以看到这三个列虽然都有索引,但这三个列的nullable属性都是Y,也就是都可为空,所以索引将失效,该语句将走全表扫描。

解决这个问题,至少将其中一列的nullable属性设置为N。这样就保证了每一行都将在索引中。

复制代码
alter table t 
  modify object_name not null;

再次查询同样的SQL语句,可以看到没有where条件的SQL语句也走了索引。

所以,一个sql语句没有where条件会不会走索引是一个有争议的问题。所以碰到这种问题只需要记得

Oracle不会为所有列的nullable属性都为Y的SQL语句走索引。

所以,我们也可以换一种方式解决,为object_id添加主键约束? 设置其它两列为notnull? 都是解决问题的方案。

相关推荐
海兰7 小时前
【数据库】tdsql(mysql8.0)优化思考三
数据库·redis
煎饼学大模型8 小时前
Agent 的“大脑-手“解耦架构:当推理层和工具执行层各自独立演进
数据库·人工智能·oracle·架构·agent
Lucifer三思而后行9 小时前
Veeam 备份 Oracle RAC 失败,是归档删除脚本的锅!
sql
muddjsv12 小时前
SQLite数据库文件机制详解:journal、wal、shm文件作用与备份避坑
数据库·sqlite
吴声子夜歌13 小时前
MongoDB 4.2——应用程序设计
数据库·mongodb
数字新视界13 小时前
动环监控可视化在数据中心管理中的应用与实践解析
数据库·物联网·解决方案·动环监控·大榕树
极地野狼 音乐哔哔13 小时前
数据库备份恢复的原理实践
数据库
互联网中的一颗神经元13 小时前
小白python入门 - 25. SQL 与表设计入门
数据库·python·sql
ttwuai13 小时前
AI 生成后台改数据后,操作日志别只记按钮:Go + MySQL 怎么验
数据库·人工智能·mysql·golang
KaMeidebaby14 小时前
卡梅德生物技术快报 | 核酸适配体文库测序:核酸适配体文库测序的技术原理、实验流程与数据解析
前端·网络·数据库·人工智能·算法