Oracle调优日记

news2024/11/18 11:42:33

Oracle调优日记

  • 前言
  • 前置知识
    • 联表查询
      • Inner Join
      • left join
      • right join
  • 环境
    • 背景描述
    • 问题展示
      • 最初代码
    • 问题解决过程
      • 优化一
      • 优化二
      • 优化三
      • 接口测试
      • 检查数据库连接
  • 总结

前言

很难想想会在600条数据和4万条数据的两张表联表查询的的情况下,查询花了10多s。这里记录一下排查过程吧,最后的错误原因也抽象的。

前置知识

联表查询

Inner Join

显示两个表的交集,如果不在两张表中就不进行显示

left join

以表1为驱动表,表2为被驱动表的数据,查出来的结果显示左边的所有数据,然后右边显示的是和左边有交集部分的数据。

right join

以表2为驱动表,表1为被驱动表的数据,查出来的结果显示右边的所有数据,然后左边显示的是和右边有交集部分的数据。

环境

JDK8、Maven3.X、SSM项目、Oracle

背景描述

每两个小时拉取最新的结果数据,在这种情况下,生成一个统计报表。其中当前4万多条的被驱动表称为A,600+数据的驱动表称为B。

问题展示

最初代码

SELECT
t1.CAR_IMG,
t1.VEH_LIC_PLT_NO,
t1.ALARM_TM,
t1.WARN_TP,
t2.DIST_NM,
t2.ENT_NM,
t1.ENT_MGMT_MBR,
t1.CON_PHONE,
t2.IND_NM
FROM
T_VEHICLE_POLLUT_QA_INFO t1,
T_VEHICLE_POLLUT_ENT_BASE_INFO t2
WHERE
t2.ENT_CODE = t2.ENT_CODE
AND t1.ALARM_TM BETWEEN TO_DATE ('2023-03-02 11:55:15', 'yyyy-mm-dd hh24:mi:ss')
AND TO_DATE ('2023-03-07 11:55:15', 'yyyy-mm-dd hh24:mi:ss');

在这里插入图片描述
没错跑了20S都没跑出来,直接依托答辩。

问题解决过程

优化一

left join 把数据量小的表作为驱动表,数据量大的作为被驱动表,同时提前将表按条件过滤,代码如下:

    <select id="selectByMap" resultMap="AlarmInfoMap">
        select t1.CAR_IMG,
        t1.VEH_LIC_PLT_NO,
        t1.ALARM_TM,
        t1.WARN_TP,
        t1.DIST_NM,
        t1.ENT_NM,
        t1.ENT_MGMT_MBR,
        t1.CON_PHONE,
        t2.IND_NM
        from
        (select ENT_CODE,IND_NM from T_VEHICLE_POLLUT_ENT_BASE_INFO
        <where>
            <if test="distCode != null and distCode != 0">
                and DIST_CODE = #{distCode,jdbcType=VARCHAR}
            </if>
            <if test="indTp != null and indTp != 0">
                and IND_NM = #{indTp,jdbcType=VARCHAR}
            </if>
        </where>
        )t2
        left join
        (
        select ENT_CODE,DIST_NM,ENT_NM,CAR_IMG,VEH_LIC_PLT_NO, ALARM_TM,WARN_TP,ENT_MGMT_MBR,CON_PHONE
        from T_VEHICLE_POLLUT_QA_INFO
        <where>
            <if test="distCode != null and distCode != 0">
                and DIST_CODE = #{distCode,jdbcType=VARCHAR}
            </if>
            <if test="startTime != null and endTime != null">
                and ALARM_TM between to_date(#{startTime,jdbcType=VARCHAR}, 'yyyy-mm-dd hh24:mi:ss') and
                to_date(#{endTime,jdbcType=VARCHAR},'yyyy-mm-dd hh24:mi:ss')
            </if>
        </where>
        ) t1
         on t1.ENT_CODE = t2.ENT_CODE
    </select>

优化二

对所有的查询字段设置索引,同时对联表的外键也建立索引。

  • 被驱动表索引
    在这里插入图片描述
  • 驱动表索引
    在这里插入图片描述

优化三

既然查数据库很慢,那么就Juc 进行异步IO查数据库,当然这里异步查最后的响应时间也是取决于最耗费时间的任务。

CompletableFuture<List<GuardVo>> guardFuture = CompletableFuture.supplyAsync(() -> guardDao.selectByMap(params), ThreadPoolUtil.getExecutorService());

CompletableFuture<List<AlarmInfoVo>> alarmFuture = CompletableFuture.supplyAsync(() -> alarmInfoDao.selectByMap(params), ThreadPoolUtil.getExecutorService());

接口测试

自信满满,接口一测试,直接蒙蔽,这是人能看的?不过幸好从直接死机到现在能出来数据了,不过10S真的很难让人接受了
在这里插入图片描述
莫非是程序问题?我查看IDEA对SQL的打印,竟然耗费了10s多,以为后端的代码应该没有问题。

我直接将解析的SQL复制到Navicat中一测竟然只有0.2ms,数据量也不大,这到底怎么回事?
在这里插入图片描述
再看看explain的结果
在这里插入图片描述
明显走了索引,Time用时很短,所以排除了SQL和后端代码的问题,只剩下配置了。

检查数据库连接

在这里插入图片描述

检查了数据库的连接,一看用的是VPN连接的远程的数据库……调回本地数据库,再次测试。
在这里插入图片描述

总结

刚接手很多任务的时候,我知道你很急,但是你先别急。

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

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

相关文章

PMP考试是什么?介绍+资料分享

我来介绍一下PMP&#xff1a; PMP考试是由PMI组织和出题&#xff0c;严格评估项目管理人员知识技能是否具有高品质的资格认证考试。 1999年&#xff0c;PMP考试在所有认证考试中第一个获得ISO9001国际质量认证,从而成为全球权威的认证考试之一。下载PMP备考资料可看封面或在文…

二叉树经典14题——初学二叉树必会的简单题

此篇皆为leetcode、牛客中的简单题型和二叉树基础操作&#xff0c;无需做过多讲解&#xff0c;仅付最优解。有需要的小伙伴直接私信我~ 目录 1.二叉树的节点个数 2.二叉树叶子节点个数 3.二叉树第K层节点个数 4.查找值为X的节点 5.leetcode——二叉树的最大深度 6.leetc…

Spark(5):RDD概述

目录 0. 相关文章链接 1. 什么是RDD 2. RDD核心属性 3. 执行原理 0. 相关文章链接 Spark文章汇总 1. 什么是RDD RDD&#xff08;Resilient Distributed Dataset&#xff09;叫做弹性分布式数据集&#xff0c;是 Spark 中最基本的数据处理模型。代码中是一个抽象类&#x…

淘宝widget链路方案总结

目前widget生态已经做了大量的基建工作,同时在widget生态的演进过程中我们发现如何匹配用户的偏好一直以来是一个挑战工作&#xff0c;本文介绍了widget的整体链路。业务背景▐ widget介绍2020年底iOS推出了新版widget之后引起了一些声浪&#xff0c;但仍然很多苹果用户并不了…

三、基本的select语句

一、SQL概述 1、SQL背景知识 2、SQL语言排行 3、SQL分类 SQL语言在功能上主要分为如下3大类&#xff1a; DDL&#xff08;Data Definition Languages、数据定义语言&#xff09;&#xff0c;这些语句定义数据库、表、视图、索引等数据库对象&#xff0c;还可以用来创建、删除…

MacOS + AndroidSDK + appium + 真手机(Android系统)环境搭建

需要的环境&#xff1a;Node.js version: ^14.17.0 || ^16.13.0 || >18.0.0NPM version > 8Java8python3Android SDK (通过Andriod Studio 安装)Appium client desktop (v1.19.1)install brew/bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/ma…

Docker启动问题docker is starting…

环境window 10 家庭最新版直接上官网安装的 Docker DeskTop问题启动应用后setting打开一直转圈圈&#xff1b;主界面一直显示 docker is starting…解决方案3.1 先确定hyper-v是否开启搜hyper-v&#xff0c;点击启动或关闭Windows功能如下,选中Hyper-V服务3.2 进入任务管理期&a…

Hive 常用函数

Hive 常用函数一、常用内置函数1、空字段赋值2、CASE WHEN THEN ELSE END3、行转列4、列转行5、窗口函数&#xff08;开窗函数&#xff09;6、Rank二、常用日期函数三、常用取整函数四、常用字符串操作函数五、集合操作一、常用内置函数 查看系统自带的函数show functions;显示…

【AcWing】学了一坤时才明白的一道题

&#x1f386;音乐分享 &#xff08;点击链接可以听哦&#xff09; The Right Path - Thomas Greenberg 这道题小吉花了一坤时才弄明白&#xff0c;虽然花的时间有点长 但是至少是明白了 &#x1f60e;&#x1f60e;&#x1f60e;&#x1f60e;&#x1f60e;&#x1f60e; …

Java程序占用CPU过高排查

使用 top 命令查看高CPU进程&#xff0c;执行命令后可以按 1 键查看各CPU 内核负载情况。CPU使用率主要看us、sy两个指标。假设 10760 是一个高CPU的进程。使用 top -H -p 查看 10760 的线程信息top -H -p 10760TIME列就是各个Java线程耗费的CPU时间。以线程ID 10952的线程为例…

Msyql聚簇索引和非聚簇索引

前提MySQL索引一直是面试中的常客&#xff0c;一提起索引&#xff0c;很多人都能答出来我知道Hash索引和B树索引&#xff0c;Hash是比较简单的&#xff0c;那么B树索引就有点复杂了。在创建表的时候&#xff0c;我们可以看到引擎有MyISAM , InnoDB等等&#xff0c;这两种是我们…

ARM uboot 的移植3 -从 uboot 官方标准uboot开始移植

一、选择合适的官方原版 uboot 1、官方原版 uboot 的版本 (1) 版本号。刚开始是 1.3.4 样式&#xff0c;后来变成 2009.08 样式。 (2) 新版和旧版的差别。uboot 的架构很早就定下来了&#xff0c;然后里面普遍公用的东西&#xff08;common 目录下、drivers 目录下、fs 目录…

CSS快速入门

文章目录一、CSS是什么&#xff1f;语法规范引入方式二、CSS选择器标签选择器类选择器ID选择器通配符选择器后代选择器子选择器并集选择器伪类选择器三、常见元素属性字体属性文本属性背景属性圆角矩形元素的显示默认块级与行级元素盒子模式去除浏览器默认样式弹性布局一、CSS是…

JUC并发编程共享模型之管程(三)(中)

4.5Monitor概念 Java 对象头 以 32 位虚拟机为例&#xff08;在32位虚拟机中&#xff0c;1个机器码等于4字节&#xff0c;也就是32bit&#xff0c;在64位虚拟机中&#xff0c;1个机器码是8个字节&#xff0c;也就是64bit&#xff09; 普通对象 数组对象 其中Mark Word 结构为…

2019年MathorCup数学建模C题汽配件制造业中的生产排程问题解题全过程文档及程序

2019年第九届MathorCup高校数学建模挑战赛 C题 汽配件制造业中的生产排程问题 原题再现&#xff1a; 整体求解过程概述(摘要) 随着市场竞争日趋激烈&#xff0c;企业开始更加注重低费高效&#xff0c;因此生产排程问题成为众多制造企业关注的热点之一。其中&#xff0c;制造行…

源码剖析Spring MVC如何将请求映射到Controller?

文章目录一、前言二、核心链路分析1、确定请求映射的入口1&#xff09;HandlerMapping注入Spring容器2&#xff09;HandlerMethod注册到MappingRegistry1> 判断Class是否为一个Handler2> 解析Class中的所有HandlerMethod 并注册到MappingRegistry中2、请求路径匹配1&…

【JavaScript速成之路】JavaScript函数

&#x1f4c3;个人主页&#xff1a;「小杨」的csdn博客 &#x1f525;系列专栏&#xff1a;【JavaScript速成之路】 &#x1f433;希望大家多多支持&#x1f970;一起进步呀&#xff01; 文章目录前言1&#xff0c;函数基础1.1&#xff0c;函数概念1.2&#xff0c;函数使用1.3&…

sHMIctrl 曲线控件使用

目录 效果 官方介绍 ​编辑 名词解释 使用方法 显示点 点在X轴位置 点在Y轴位置 量程 单位 如何设置自动标尺数据 设置量程 设置单位 效果 官方介绍 名词解释 四条曲线&#xff1a;同时最多使用4条曲线。 每条条曲线最多512点&#xff1a;X2-X1-Xn&#xff1b; 数据自定…

认识CSS值如何提高写前端代码的效率

&#x1f31f;所属专栏&#xff1a;前端只因变凤凰之路&#x1f414;作者简介&#xff1a;rchjr——五带信管菜只因一枚&#x1f62e;前言&#xff1a;该系列将持续更新前端的相关学习笔记&#xff0c;欢迎和我一样的小白订阅&#xff0c;一起学习共同进步~&#x1f449;文章简…

Spring注解开发之组件注册(一)

Spring注解开发 Spring注解开发之组件注册下半篇 IOC&#xff0c;中文名为控制反转&#xff0c;是将Java的bean对象存储在容器中&#xff0c;当需要使用时&#xff0c;通过名字获取该对象。而不是通过new关键字去创建。 1.Configuration & Bean给容器中注册组件 第一种&…