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? 都是解决问题的方案。

相关推荐
小蒜学长15 分钟前
校园社团招新网站的设计与实现(代码+数据库+LW)
java·数据库·spring boot·后端·校园社团招新网站
布莱克6051 小时前
MySQL 增删改查(CRUD)语法详解
数据库·mysql·增删改查
Dovis(誓平步青云)1 小时前
几个方案来回选不定?做一个随时切换的候选推荐页
android·java·服务器·开发语言·javascript·数据库·智能化
2501_933670792 小时前
2027届大数据管理与应用求职数字化转型顾问:项目、SQL、业务理解怎么排优先级
数据库·sql
东方护航数据恢复(深圳)3 小时前
物流案例:勒索病毒 Mallox 加密 ERP 数据库,旧备份 + 残留页重组实录【东方护航数据恢复深圳店】
数据库·数据恢复·勒索病毒·二次开盘·开盘·数据镜像
.Hypocritical.3 小时前
Redis从入门到实战:核心原理、场景落地与避坑指南
数据库·redis·缓存
梦想画家3 小时前
SQLMesh Python 模型入门(二):依赖管理、引擎实战与内存优化
数据库·python·sqlmesh
Omics Pro4 小时前
经典多组学整合算法→商用云平台
数据库·人工智能·算法·机器学习·自然语言处理
xcLeigh4 小时前
【KingbaseES数据库教程】国产化信创背景下的数据库选型与初识
linux·数据库·windows·kes·数据选型
资深技术分享员4 小时前
Geejing WebBuilder 数据库连接配置与在线 SQL 工具,运维的左右手
运维·数据库·sql·低代码