当前位置: 首页 > article >正文

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

http://www.kler.cn/news/333564.html

相关文章:

  • Shell文本处理(三)
  • 古典舞在线互动:SpringBoot平台设计与功能实现
  • 鸿蒙HarmonyOS NEXT 电商APP开发,打造你的专属购物商城
  • 【算法笔记】滑动窗口算法原理深度剖析
  • Python | Leetcode Python题解之第454题四数相加II
  • FPGA实现PCIE图片采集转HDMI输出,基于XDMA中断架构,提供3套工程源码和技术支持
  • 使用LlamaIndex构建RAG
  • CTFshow 命令执行 web29~web36(正则匹配绕过)
  • 量子计算:颠覆未来计算的革命性技术
  • MySQL 启动失败 (code=exited, status=1/FAILURE) 异常解决方案
  • 手机/平板端 Wallpaper 动态壁纸文件获取及白嫖使用指南
  • CountDownlatch、CyclicBarrier、Semaphore使用介绍
  • 湖州自闭症寄宿学校:为孩子打造安全温馨的学习环境
  • SparkSQL-性能调优
  • 电脑失声,一招搞定
  • Bootstrap 4 导航栏:构建响应式和现代的网页导航
  • 【2006.07】UMLS工具——MetaMap原理深度解析
  • 21.1 k8s接口鉴权token认证和prometheus的实现
  • matlab 求绝对值
  • 1.资源《Arduino UNO R3 proteus 仿真工程》说明。