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

oracle执行计划中,同一条语句块,在不同情况下执行计划不一样问题。子查询,union 导致索引失效。

场景:
需要获取部分数据集(视图)的业务时间最大值,希望只通过一条语句获取多个的最大值。
则使用select (视图1业务时间最大值),(视图2业务时间最大值),(视图3业务时间最大值) from dual
程序执行过程中,发现语句执行较慢,则进行sql调优。

使用子方式查询,获取最大值

子查询是一个嵌套在另一个查询语句中的查询语句。它可以被视为一个查询被包含在另一个查询中的过滤条件,可以在查询语句中的WHERE,FROM或SELECT子句中使用。子查询可以返回单个值、单个行或多个行,并且可以被用来解决复杂性问题或减少查询中的代码复杂性。

select (SELECT max(SJGXSJ) TIME_MAXFROM v_yewu1where SJGXSJ >= sysdate - 1and SJGXSJ < sysdate) AS TIME1,NULL AS TIME2,NULL AS TIME3,NULL AS TIME4,NULL AS TIME5from dualwhere 1 = 1

在这里插入图片描述
如图,效果很不理想。
如果是拿子查询的语句出来,单独查询,就会走时间索引,就很快。
在这里插入图片描述

使用union方式查询,获取最大值

在这里插入图片描述
改成union空表
在这里插入图片描述
union是合并两个查询的,怎么也会导致执行计划发生改变呢,第一时间想到的是union中去重导致的。然后我吧union 改成union all结果,执行计划还是很糟糕。
在这里插入图片描述

使用join方式查询,获取最大值

最后,把语句改成关联的形式,总算是满足了实际的业务需要。

select t1.TIME_MAX AS TIME1,t2.TIME_MAX AS TIME2,NULL        AS TIME3,NULL        AS TIME4,NULL        AS TIME5from (SELECT max(SJGXSJ) TIME_MAXFROM  v_yuwu1where SJGXSJ >= sysdate - 1and SJGXSJ < sysdate) t1,(SELECT max(SJGXSJ) TIME_MAXFROM v_yuwu2where SJGXSJ >= sysdate - 1and SJGXSJ < sysdate) t2awhere 1 = 1

在这里插入图片描述

总结

sql执行过程中,视图查询,使用子查询、union或者多层视图嵌套,都可能会导致执行计划发生改变,多层视图嵌套结构的语句,where条件位置等都有可能导致执行计划发生改变,索引不生效的问题,这些应当尽量避免。sql调优过程中也可以使用些hint进行优化。使用视图查询,还是有明显的劣势,条件允许,尽量使用直接的sql语句查询,并且避免sql里面用到视图。

http://www.lryc.cn/news/178689.html

相关文章:

  • 【新的小主机】向日葵远程控制ubuntu
  • 在Android studio高版本上使用低版本的Github项目库报错未能解析:Landroid/support/v4/app/FrageActivity;
  • 自动混剪多段视频、合并音频、添加文案的技巧分享
  • 学习笔记——BSGS
  • 【AI视野·今日NLP 自然语言处理论文速览 第四十期】Mon, 25 Sep 2023
  • Linux C/C++下收集指定域名的子域名信息(类似dnsmap实现)
  • linux-定时任务
  • 在Spring Boot项目中使用Redisson
  • JavaScript 函数柯里化
  • springboot实现ACL+RBAC权限体系
  • C++20协程示例
  • 【Verilog 教程】6.2Verilog任务
  • Spring修炼之路(1)基础入门
  • GANs学习记录
  • Flink-CDC——MySQL、SqlSqlServer、Oracle、达梦等数据库开启日志方法
  • linux设置tomcat redis开机自启动
  • 跨域问题讨论
  • ESP32设备通信-两个ESP32设备之间HTTP通信
  • 数据结构学习笔记——查找算法中的树形查找(平衡二叉树)
  • P1830 轰炸III
  • 大语言模型LLM知多少?
  • Redis命令行使用Lua脚本
  • HTML详细基础(三)表单控件
  • map和set的具体用法 【C++】
  • 聚合统一,SpringBoot实现全局响应和全局异常处理
  • 【C/C++笔试练习】——数组名和数组名、switch循环语句、数据在计算机中的存储顺序、字符串中找出连续最长的数字串、数组中出现次数超过一半的数字
  • 力扣每日一题(+日常水题|树型dp)
  • 使用perming加速训练可预测的模型
  • 【数据库】存储引擎InnoDB、MyISAM、关系型数据库和非关系型数据库、如何执行一条SQL等重点知识汇总
  • 车道线分割检测