OB_MYSQL UPDATE 优化案例

news/2024/9/21 16:39:28

在工单系统上看到有一条SQL问题还没解决,直接联系这位同学看看是否需要帮忙。

 

慢SQL:

UPDATE  A
SET CORPORATION_NAME = (SELECT DISTINCT CORPORATION_NAMEFROM (SELECT CONTRACT_NO, COOP_SERVICE_TYPE, CORPORATION_NAME, PROJECT_NAME, ROW_NUMBER() OVER (PARTITION BY CONTRACT_NO, COOP_SERVICE_TYPE ) AS SEQFROM O_PLIS_PROC BWHERE B.BDHA_TX_DATE='2024-06-10' AND A.LM_CT1_NO = B.CONTRACT_NO) BWHERE B.COOP_SERVICE_TYPE='01' AND B.SEQ = 1
)
WHERE LM_CT1_NO IN (SELECT  CONTRACT_NOFROM O_PLIS_PROC CWHERE C.CONTRACT_NO=A.LM_CT1_NOAND 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_NAMEFROM 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_NOFROM O_PLIS_PROC CWHERE C.CONTRACT_NO=A.LM_CT1_NO
);

改写后的sql 5秒能跑出结果,和原来逻辑一样,提升不大。

 

遇到性能慢的sql语句,不要一上来就想着等价改写,先通过索引进行优化,合理的索引能解决90%的性能问题。

如果索引都解决不了的情况下,才去尝试使用等价改写来进行优化sql,一般来说等价改写能解决剩下5%的问题。

如果连等价改写都解决不了剩下的5%的性能问题话,就要尝试改业务,或者改数据库技术栈来解决问题了,这种通常来说成本会非常高。 

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

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

相关文章

转载使用inotify-tools监控文件夹或文件的变动

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 原文链接:https://blog.csdn.net/ywd1992/article/details/106251339文章目录 一、 前言什么是inotify和inotify-tools 检查系统是否支持inotify 二、安装使用inotify-tools 获取…

在 KubeSphere 上快速安装和使用 KDP 云原生数据平台

作者简介:金津,智领云高级研发经理,华中科技大学计算机系硕士。加入智领云 8 余年,长期从事云原生、容器化编排领域研发工作,主导了智领云自研的 BDOS 应用云平台、云原生大数据平台 KDP 等产品的开发,并在多个大规模项目中成功实施落地,在大规模容器化编排系统方向有丰…

【New Relic】给基于.NET Framework 4.0 的 exe 程序安装New Relic

由于.NET Framework 4.0 是比较古老的版本,只有New Relic 7.0以下的版本才会支持.NET Framework 4.0的引用程序。 Technical support for .NET Framework 4.0 or lower 你可以参考这个官方Install New Relic to Monitor your App的文档。1. 创建New Relic 账号 创建一个New R…

02-Excel初阶操作-学习笔记

数据透视表专题续 利用筛选字段切换数据场景:在数据透视表中显示各个所属地区每个月筛选出宠物用品类别,销售部门为三科的发生额,并在会议时展示,样例如下所示。具体操作step1:制作数据透视表 点击任意单元格——插入选项卡——数据透视表——将“订购日期”拖拽到行字段,…

开始预习数据库第四天中

你怎么知道我马上要考的数据库(4) 开始时间 2024-06-18 13:50:10 结束时间 2024-06-18 15:35:38 前言:中午休息结束,追上了一把十剪纸,但是确实打不过九吉星,主要是发财树搞钱太多了,实在打不过两张以上的三星五费。总结:去消社买饮料去,休息会,下半场复习数学建模,…

schema-change-implement

TiDB 的异步 schema 变更实现 背景 现在一般数据库在进行 DDL 操作时都会锁表,导致线上对此表的 DML 操作全部进入等待状态(有些数据支持读操作,但是也以消耗大量内存为代价),即很多涉及此表的业务都处于阻塞状态,表越大,影响时间越久。这使得 DBA 在做此类操作前要做足…

Xilinxddr3 mig ip核:基于native接口的ddr3读写控制

一、MIG IP核读写时序如下图是7系列的MIG IP核结构框图。左侧是用户接口,即用户(FPGA)同MIG交互的接口,用户就必须掌握这些接口才可以使用该IP核。将用户侧的信号分类如下图。其中的输入输出是相对于MIG IP核的,即对用户侧来说是相反的。写命令操作时序如下,其中,写操作…