OB_MYSQL UPDATE 优化案例
在工单系统上看到有一条SQL问题还没解决,直接联系这位同学看看是否需要帮忙。
慢SQL:
- UPDATE A
- SET CORPORATION_NAME = (
- SELECT DISTINCT CORPORATION_NAME
- FROM (
- SELECT CONTRACT_NO,
- COOP_SERVICE_TYPE,
- CORPORATION_NAME,
- PROJECT_NAME,
- ROW_NUMBER() OVER (PARTITION BY CONTRACT_NO, COOP_SERVICE_TYPE ) AS SEQ
- FROM O_PLIS_PROC B
- WHERE B.BDHA_TX_DATE='2024-06-10' AND A.LM_CT1_NO = B.CONTRACT_NO
- ) B
- WHERE B.COOP_SERVICE_TYPE='01' AND B.SEQ = 1
- )
- WHERE LM_CT1_NO IN (
- SELECT CONTRACT_NO
- FROM O_PLIS_PROC C
- WHERE C.CONTRACT_NO=A.LM_CT1_NO
- AND C.COOP_SERVICE_TYPE='01'
- AND C.BDHA_TX_DATE='2024-06-10'
- );
执行计划:
上面sql 跑超时都跑不出结果,估计要执行非常长时间。
这条sql in 后面关联返回107911行数据,update set ... 可以理解成标量子查询,返回1107911数据相当于 update set 标量子查询也要执行107911次。
标量子查询最重要的是要走对索引,然而这个sql计划根本没走索引,这位同学的问题也是如何通过改写来消除标量子查询,很明显这个思路是错误的。
添加合适的索引:
- CREATE INDEX TEST ON O_PLIS_PROC(
BDHA_TX_DATE,
COOP_SERVICE_TYPE,
CONTRACT_NO,
COOP_SERVICE_TYPE,
CORPORATION_NAME);
很明显,创建索引以后计划显示能用上索引,sql整体5秒能执行完成。
再提供个相同逻辑的等价改写方案:
- WITH O_PLIS_PROC as (
- SELECT
- CONTRACT_NO,
- COOP_SERVICE_TYPE,
- CORPORATION_NAME
- FROM O_PLIS_PROC
- WHERE BDHA_TX_DATE='2024-06-10' AND COOP_SERVICE_TYPE='01'
- )
- UPDATE A
- SET CORPORATION_NAME = (
- SELECT CORPORATION_NAME
- FROM O_PLIS_PROC B
- WHERE A.LM_CT1_NO = B.CONTRACT_NO GROUP BY CONTRACT_NO, COOP_SERVICE_TYPE LIMIT 1 )
- WHERE LM_CT1_NO IN (
- SELECT CONTRACT_NO
- FROM O_PLIS_PROC C
- WHERE C.CONTRACT_NO=A.LM_CT1_NO
- );
改写后的sql 5秒能跑出结果,和原来逻辑一样,提升不大。
遇到性能慢的sql语句,不要一上来就想着等价改写,先通过索引进行优化,合理的索引能解决90%的性能问题。
如果索引都解决不了的情况下,才去尝试使用等价改写来进行优化sql,一般来说等价改写能解决剩下5%的问题。
如果连等价改写都解决不了剩下的5%的性能问题话,就要尝试改业务,或者改数据库技术栈来解决问题了,这种通常来说成本会非常高。
OB_MYSQL UPDATE 优化案例的更多相关文章
- mysql优化案例
MySQL优化案例 Mysql5.1大表分区效率测试 Mysql5.1大表分区效率测试MySQL | add at 2009-03-27 12:29:31 by PConline | view:60, ...
- SQL 优化案例 1
create or replace procedure SP_GET_NEWEST_CAPTCHA( v_ACCOUNT_ID in VARCHAR2, --接收短信的手机号 v_Tail_num i ...
- SQL 优化案例
create or replace procedure SP_GET_NEWEST_CAPTCHA( v_ACCOUNT_ID in VARCHAR2, --接收短信的手机号 v_Tail_num i ...
- 数据库优化案例——————某市中心医院HIS系统
记得在自己学习数据库知识的时候特别喜欢看案例,因为优化的手段是容易掌握的,但是整体的优化思想是很难学会的.这也是为什么自己特别喜欢看案例,今天也开始分享自己做的优化案例. 最近一直很忙,博客产出也少的 ...
- 老李案例分享:Weblogic性能优化案例
老李案例分享:Weblogic性能优化案例 POPTEST的测试技术交流qq群:450192312 网站应用首页大小在130K左右,在之前的测试过程中,其百用户并发的平均响应能力在6.5秒,性能优化后 ...
- Hive优化案例
1.Hadoop计算框架的特点 数据量大不是问题,数据倾斜是个问题. jobs数比较多的作业效率相对比较低,比如即使有几百万的表,如果多次关联多次汇总,产生十几个jobs,耗时很长.原因是map re ...
- 数据库优化案例——————某知名零售企业ERP系统
写在前面 记得在自己学习数据库知识的时候特别喜欢看案例,因为优化的手段是容易掌握的,但是整体的优化思想是很难学会的.这也是为什么自己特别喜欢看案例,今天也分享自己做的优化案例. 之前分享过OA系统.H ...
- Spark集群之yarn提交作业优化案例
Spark集群之yarn提交作业优化案例 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.启动Hadoop集群 1>.自定义批量管理脚本 [yinzhengjie@s101 ...
- MySQL参数优化案例
环境介绍 优化层级与指导思想 优化过程 最小化安装情况下的性能表现 优化innodb_buffer_pool_size 优化innodb_log_files_in_group&innodb_l ...
- MySQL的索引单表优化案例分析
建表 建立本次优化案例中所需的数据库及数据表 CREATE DATABASE db0206; USE db0206; CREATE TABLE `db0206`.`article`( `id` INT ...
随机推荐
- git fatal detected dubious ownership in repository 的解决方法
我换了一台电脑,将旧电脑的硬盘换到新电脑上:我装了双系统,切换到另一个系统时:我发现了 git 代码仓库无法执行 git 命令,不断报错 fatal: detected dubious ownersh ...
- 2019-9-30-dotnet-枚举当前设备wifi热点
title author date CreateTime categories dotnet 枚举当前设备wifi热点 lindexi 2019-09-30 14:42:18 +0800 2019-9 ...
- Oracle、达梦:获取两个表中差异的数据:minus(减法)
Oracle.达梦:获取两个表中差异的数据:minus(减法) mysql没有.需要用别的方式替换 表结构必须一致,数据也必须一致才能减去 真实意思:T_1中的数据减去T_2中的数据.返回还多余的数据 ...
- 接私活利器!推荐一个基于SpringBoot3的后台管理框架
大家好,我是 Java陈序员. 今天,给大家推荐一个后台管理框架,适合二次定制开发.接私活.源码学习等场景. 关注微信公众号:[Java陈序员],获取开源项目分享.AI副业分享.超200本经典计算机电 ...
- nvm环境安装
目录 nvm是什么 使用背景 nvm的坑. nvm,node,npm之间的区别. nvm.nodejs.npm的关系: nvm-windows下载地址 安装 linux . mac 源码包下载地址 解 ...
- linux系统共享文件夹到局域网
python3 -m http.server https://blog.csdn.net/a772304419/article/details/113338103 Debian下配置Samba服务器 ...
- python教程2:if...else...+循环
一.if判断 有单分支.双分支.多分支,下面就是一个多分支的案例: 二.缩进 三.for循环 四.while循环 五.其他 random模块 string模块
- JavaScript字符串对象转JSON格式
JavaScript字符串对象转JSON格式 原始数据 { xAxis: { type: 'category', data: ['Mon', 'Tue', ...
- Sed 日常使用介绍
Sed 日常使用介绍 简介 sed 是 unix 环境下常用的流处理工具, 可以处理字符流, 文件或者二进制文件流. 各个 unix/linux 发行版都会配备 sed 及其衍生的命令工具, 因此, ...
- Vue cli之路由router
一.安装路由 Vue-router用于提供给vue项目在开发中用于绑定url和组件页面的关系的核心插件. 默认情况下,vue没有提供路由的功能,所以我们使用vue-router,并需要在项目根目录. ...