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

news2024/12/29 11:39:47

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

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

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

select (SELECT max(SJGXSJ) TIME_MAX
          FROM v_yewu1
         where SJGXSJ >= sysdate - 1
           and SJGXSJ < sysdate) AS TIME1,
       NULL AS TIME2,
       NULL AS TIME3,
       NULL AS TIME4,
       NULL AS TIME5
  from dual
 where 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 TIME5
  from (SELECT max(SJGXSJ) TIME_MAX
          FROM  v_yuwu1
         where SJGXSJ >= sysdate - 1
           and SJGXSJ < sysdate) t1,
       (SELECT max(SJGXSJ) TIME_MAX
          FROM v_yuwu2
         where SJGXSJ >= sysdate - 1
           and SJGXSJ < sysdate) t2a
 where 1 = 1

在这里插入图片描述

总结

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1036062.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

描述符——配置描述符

描述符定义 描述符实现 /*** brief USB configuration descriptor.*/ typedef struct __attribute__ ((packed)) {uint8_t bLength ; /**< Size of this descriptor in bytes. */uint8_t bDescriptorType ; /**< CONFIGURATION Descriptor Type. */ui…

使用ElementUI完成登入注册的跨域请求,结合vue-cli搭建的SPA项目,减少冗余代码提升开发效率

目录 一、跨域的概述 ( 1 ) 讲述 ( 2 ) 特点 如何跨域: 二、ElementUI ( 1 ) 导入 ( 2 ) 搭建 ( 3 ) 页面 三、数据交互 ( 1 ) 安装相关模块 安装模块 引用模块 ( 2 ) axios的get请求 ( 3 ) axios的post请求 四、注册功能 带来的收获 一、跨域的概述 …

安卓实现网格布局的效果

文章目录 页面子项布局 Activity适配器 运行结果其他文章 页面 RecyclerView是Android开发中常用的列表控件之一&#xff0c;可以用于展示大量数据以及实现各种布局效果。本文章使用RecyclerView的GridLayoutManager来实现网格布局&#xff0c;显示指定列数。 首先&#xff0c…

25. 图论 - 路径和算法

文章目录 拓展:顶点和边的互换最短路径问题Dijkstra算法Hi, 你好。我是茶桁。 在充分了解图的概念,构成以及种类之后,我们要开始进入稍微有点难度的部分了。这节课,咱们来了解一下路径和Dijkstra算法。 拓展:顶点和边的互换 在这节课正式开始之前,我们对上一节课稍微扩…

Java笔记:认识运行时数据区

1. 运行时数据区概述 1.1 JVM运行时数据区规范 JVM虚拟机组成&#xff1a;方法区(类信息)、堆(伊甸园、老年代、永久代:new的对象等)、虚拟机栈、程序计数器、本地方法栈1.方法区和堆是内存共享的 2.虚拟机栈、本地方法栈、程序计数器是内存不共享的3.方法区&#xff1a;类信息…

描述符——接口描述符

描述符定义 描述符实现 /*** brief USB interface descriptor.*/ typedef struct __attribute__ ((packed)) {uint8_t bLength ; /**< Size of this descriptor in bytes. */uint8_t bDescriptorType ; /**< INTERFACE Descriptor Type. */uint8_t bIn…

MySQL数据库——索引(3)-索引语法(创建索引、查看索引、删除索引、案例演示),SQL性能分析(SQL执行频率,慢查询日志)

目录 索引语法 创建索引 查看索引 删除索引 案例演示 SQL性能分析 SQL执行频率 慢查询日志 索引语法 创建索引 CREATE [ UNIQUE | FULLTEXT ] INDEX index_name ON table_name (index_col_name,... ) ; 查看索引 SHOW INDEX FROM table_name ; 删除索引 DROP INDEX …

AD拼板技巧

AD拼板设置 如图&#xff0c;有一个需要拼板的PCB&#xff0c;想要在生产是拼接生产&#xff0c;节省材料。 操作如下&#xff1a; 1、全选如下&#xff0c;按复制CtrlC。 2、把输入法调整至英文&#xff0c;按快捷键E&#xff08;先&#xff09;&#xff0c; A&#xff08;后…

开发工具MobaXterm(终极终端)

MobaXterm 又名 MobaXVT&#xff0c;是一款增强型终端、X 服务器和 Unix 命令集(GNU/ Cygwin)工具箱。 常用SSH客户端介绍&#xff1a; SSH 为 Secure Shell 的缩写&#xff0c;是目前较可靠&#xff0c;专为远程登录会话和其他网络服务提供安全性的协议。利用 SSH 协议可以有…

【1993. 树上的操作】

来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 描述&#xff1a; 给你一棵 n 个节点的树&#xff0c;编号从 0 到 n - 1 &#xff0c;以父节点数组 parent 的形式给出&#xff0c;其中 parent[i] 是第 i 个节点的父节点。树的根节点为 0 号节点&#xff0c;所以 par…

C++中的Template

模板的概念 建立通用的模具&#xff0c;大大提高复用性 模板不可直接使用 函数模板 函数模板语法 函数模板作用&#xff1a; 建立一个通用函数&#xff0c;其函数返回值类型和形参类型可以不具体制定&#xff0c;用一个虚拟的类型来代表。 语法&#xff1a; template&l…

小程序社区团购demo

概述 实现了用户登录或者手机号&#xff0c;加入团长&#xff0c;邀请团长&#xff0c;各种佣金明细等页面 详细 需求&#xff1a; 根据市场信息反馈&#xff0c;社区团购比较火&#xff0c;有流量的用户可以推广页面 实现了功能&#xff1a; 实现了用户微信登录自动获取…

vue之 h() 函数

前言 Vue推荐在绝大数情况下使用模板来创建HTML&#xff0c;然后一些特殊的场景&#xff0c;你真的需要JavaScript的完全编程的能力&#xff0c;这个时候你可以使用渲染函数 &#xff0c;它比模板更接近编译器&#xff1b; h()函数是什么 Vue在生成真实的DOM之前&#xff0c…

如何用好免费的ChatGPT

如何用好免费的ChatGPT 前言ChatGPT使用入口在线体验地址&#xff1a;点我体验 ChatGPT介绍ChatGPT初级使用技巧初级使用技巧&#xff1a;清晰明了的问题表达 ChatGPT中级使用语法中级使用语法&#xff1a;具体化问题并提供背景信息 ChatGPT高级使用高级使用&#xff1a;追问、…

Vue中如何进行表格排序与过滤

Vue中如何进行表格排序与过滤 在Vue.js中&#xff0c;表格是一个常见的数据展示方式。很多时候&#xff0c;我们需要对表格中的数据进行排序和过滤&#xff0c;以提供更好的用户体验。本文将介绍如何在Vue中实现表格的排序和过滤功能&#xff0c;并提供相关的代码示例。 准备工…

WebSocket通信安全概览

文章前言 在一次做项目的时候本来是想去点击Burpsuite的Proxy界面的HTTP History选项卡来查看HTTP历史请求记录信息并做测试的&#xff0c;但是在查看的时候却下意识的点击到了HTTP Proxy右侧的"WebSockets History"选项卡中&#xff0c;从界面的交互历史中发现网站…

2023华为杯数模C题——大规模创新类竞赛评审方案研究

B题——大规模创新类竞赛评审方案研究 思路&#xff1a;采用数据分析等手段改进评分算法性能 完成情况(1-2问已经完成) 代码下载 问题一 在每个评审阶段&#xff0c;作品通常都是随机分发的&#xff0c;每份作品需要多位评委独立评审。为了增加不同评审专家所给成绩之间的可比…

c语言代码

目录 1.利用goto的关机程序 2.交换两个整数&#xff08;容易出现的错误&#xff09; 2.1 错误示范 2.1.1 错误的原因 3.函数调用进行折半查找 3.1错误版本 3.1.1错误原因 4.写一个函数&#xff0c;每调用一次这个函数&#xff0c;就会将num的值增加1。 4.1使用传值进去 5.有关p…

【初阶数据结构】二叉树全面知识总结

二叉树详解 树的概念及其结构树的概念树的相关概念树的表示方法孩纸兄弟表示法双亲表示法&#xff08;并查集&#xff09; 树的实际应用 二叉树二叉树的概念二叉树的种类二叉树的性质二叉树的存储结构 二叉树顺序结构的实现堆的概念及结构堆向上、向下调整法堆的插入堆的删除堆…

基于ENC28J60+uIP1.0+STM32的UDP Server实现,服务器主动发送数据的实现,几个关键的问题可算整明白了!

ENC28J60&#xff0c;是一款SPI接口的以太网PHYMAC芯片&#xff0c;实现以太网物理层和MAC层硬件通信。uIP是一个TCP/IP软件协议栈&#xff0c;实现TCP、UDP、ARP、ICMP等网络协议。STM32F103RCT6通过SPI接口与ENC28J60通讯&#xff0c;并移植uIP协议&#xff0c;实现一个小型的…