在工单系统上看到有一条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 优化案例的更多相关文章

  1. mysql优化案例

    MySQL优化案例 Mysql5.1大表分区效率测试 Mysql5.1大表分区效率测试MySQL | add at 2009-03-27 12:29:31 by PConline | view:60, ...

  2. SQL 优化案例 1

    create or replace procedure SP_GET_NEWEST_CAPTCHA( v_ACCOUNT_ID in VARCHAR2, --接收短信的手机号 v_Tail_num i ...

  3. SQL 优化案例

    create or replace procedure SP_GET_NEWEST_CAPTCHA( v_ACCOUNT_ID in VARCHAR2, --接收短信的手机号 v_Tail_num i ...

  4. 数据库优化案例——————某市中心医院HIS系统

    记得在自己学习数据库知识的时候特别喜欢看案例,因为优化的手段是容易掌握的,但是整体的优化思想是很难学会的.这也是为什么自己特别喜欢看案例,今天也开始分享自己做的优化案例. 最近一直很忙,博客产出也少的 ...

  5. 老李案例分享:Weblogic性能优化案例

    老李案例分享:Weblogic性能优化案例 POPTEST的测试技术交流qq群:450192312 网站应用首页大小在130K左右,在之前的测试过程中,其百用户并发的平均响应能力在6.5秒,性能优化后 ...

  6. Hive优化案例

    1.Hadoop计算框架的特点 数据量大不是问题,数据倾斜是个问题. jobs数比较多的作业效率相对比较低,比如即使有几百万的表,如果多次关联多次汇总,产生十几个jobs,耗时很长.原因是map re ...

  7. 数据库优化案例——————某知名零售企业ERP系统

    写在前面 记得在自己学习数据库知识的时候特别喜欢看案例,因为优化的手段是容易掌握的,但是整体的优化思想是很难学会的.这也是为什么自己特别喜欢看案例,今天也分享自己做的优化案例. 之前分享过OA系统.H ...

  8. Spark集群之yarn提交作业优化案例

    Spark集群之yarn提交作业优化案例 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.启动Hadoop集群 1>.自定义批量管理脚本 [yinzhengjie@s101 ...

  9. MySQL参数优化案例

    环境介绍 优化层级与指导思想 优化过程 最小化安装情况下的性能表现 优化innodb_buffer_pool_size 优化innodb_log_files_in_group&innodb_l ...

  10. MySQL的索引单表优化案例分析

    建表 建立本次优化案例中所需的数据库及数据表 CREATE DATABASE db0206; USE db0206; CREATE TABLE `db0206`.`article`( `id` INT ...

随机推荐

  1. [BEX] Quasar BEX 提供的那些配置

    Manifest.json https://developer.chrome.com/extensions/manifest Background Script & Content Scrip ...

  2. 2019-9-27-微软的-P2P-下载方式

    title author date CreateTime categories 微软的 P2P 下载方式 lindexi 2019-09-27 09:44:44 +0800 2019-09-27 09 ...

  3. nginx+uwsgi介绍

    一.nginx+uwsgi介绍 pip list # 查看安装过的模块 rpm -q nginx # 查看是否安装某款服务 pip install django == 1.11.11 # 安装djan ...

  4. PostMan接口测试实用小点

    PostMan接口测试实用小点 1. 接口测试变量存取操作 在Postman中有很多地方可以存储一些变量,这里只介绍经常使用的环境变量.变量设置后,在UI界面可以通过{{变量名}}获取到对应值. 在环 ...

  5. ASP.NET Core的全局拦截器(在页面回发时,如果判断当前请求不合法,不执行OnPost处理器)

    ASP.NET Core RazorPages中,我们可以在页面模型基类中重载OnPageHandlerExecuting方法. 下面的例子中,BaseModel继承自 PageModel,是所有页面 ...

  6. ansible功能实现

    模糊匹配远程主机文件并拉取到本地服务器 又熬夜加班了.花很长时间研究出来.如何实现模糊匹配到的远程文件批量拉取到本地的剧本.使用copy模块的*,shll模块的* ls|grep XX都没有实现,貌似 ...

  7. layui 新增行

    layui表格新增行目前只在从内存加载数据的情况下可行! 在多方查找数据与实验后,我发现layui确实只能在直接赋值数据(从内存加载数据)的情况下新增行,即首次渲染表格时使用内存数据给表格的data参 ...

  8. 当装饰者模式遇上Read Through缓存,一场技术的浪漫邂逅

    在<经验之谈:我为什么选择了这样一个激进的缓存大Key治理方案>一文中,我提到在系统中使用的缓存是旁路缓存模式,有读者朋友问,有没有用到过其他的缓存模式,本文将结合一个我曾经工作中的案例, ...

  9. Windows Server 2022 初始设置

    添加本地用户 添加新的本地用户. 在CUI配置上,按如下方式设置. 使用管理员权限运行 PowerShell 并按如下方式进行配置. Windows PowerShell 版权所由 (C) Micro ...

  10. Instsrv.exe 与 Srvany.exe 安装Windows服务

    原理:Instsrv.exe可以给系统安装和删除服务 Srvany.exe可以让exe程序以服务的方式运行(Srvany只是exe注册程序的服务外壳,可以通过它让我们的程序以SYSTEM账户活动,随电 ...