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

相关推荐
jaysee-sjc23 分钟前
【苍穹外卖】Day12:工作台数据看板与 Excel 报表导出
java·开发语言·数据库·spring boot·spring·微信·excel
sunburn-42 分钟前
数据库聚合查询完整教程:从基础函数到实战统计
java·数据库·mysql·数据库开发
小蒜学长1 小时前
基于 Spring Boot 的英语单词背诵系统的设计与实现(代码+数据库+LW)
java·数据库·spring boot·后端
中电金信1 小时前
开发更高效、监控更实时、运维更省心,源启数据开发平台构筑一站式数据开发新底座
网络·数据库·人工智能
泡海椒1 小时前
深度解析JQuick-SQL 谓词下推与投影下推优化机制
数据库·sql
❀͜͡傀儡师2 小时前
MySQL REST Service 认证鉴权体系与 MySQL 26.10.0 内置化演进
数据库·mysql·adb
wifi___2 小时前
Redis分布式锁
数据库·redis·分布式
4SAPI2 小时前
营销内容生成大模型 API 生产选型指南:4SAPI、硅基流动与 OpenRouter 的架构权衡
数据库·人工智能·架构·php
zyxqyy&∞2 小时前
sqli-labs-union联合查询(Less1-Less4)
数据库·安全
数据库小学妹3 小时前
MySQL binlog格式怎么选?ROW、STATEMENT、MIXED的区别与坑
数据库·mysql·binlog·主从复制·数据一致性