关于CASE WHEN造成的查询缓慢的生产问题思考

2023-11-15

因为做的是类似SAAS的系统,关于同一个业务没会有不同的视角,有管理员,有类别分类的,有特别逻辑处理的。总而言之涉及到很多方面,再加上历史遗留问题导致导致的数据问题,这SQL写起来真的酸爽。

除了简单的关联,还要考虑到一个效率问题,最近就因为CASE WHEN导致了一个线上查询缓慢,差一点就要超过客户端设置的超时请求设置的一个问题。

问题详情:
现在有一个检查盘点资产的要求,之前只是要求在数据库有拿过资产的员工去发检查清单,

检查单表 check
检查详情(针对涉及到的资产每一个生成对应数据)check_detail
货物资产 asset 员工表employee
员工返回检查结果(针对的涉及到的员工每一个生成数据) employee_check

问题来了之前的逻辑,实际上员工领用资产了那他的check_detail和employee_check是对应的上的

但是没有的话就对应不上了,之前只检查有资产的员工,现在还要检查没有领用资产的(万一有惊喜呢)

Mybaitis写的SQL一部分

  <if test="maps.employeeId != null ">
          AND CASE WHEN aio.no_use_asset_employee_join = 1 THEN (  aius.employee_id = #{maps.employeeId}  )
          ELSE ( aiod.employee_id = #{maps.employeeId}  && aius.employee_id = #{maps.employeeId}  ) END
   </if>

就是有1的时候所用人都参与,0的时候要满足两个条件,在范围的员工还要有资产

但是一上生产就完了,一张表只有几万条数据巨卡,两三秒才返回差一点就超时的那种

检查SQL 用Explain分析发现该走的索引也都走了,就是很慢,而且随便从日志找一条SQL发现实际涉及到的行数也不多,大概是三个解析,最多的也才两百多行,为什么会这么慢?

实际上就是结果集else的时候他既要匹配aiod.employee_id = #{maps.employeeId} 又要 aius.employee_id = #{maps.employeeId}
类似于SQL函数,没走索引,效率很慢。

那优化怎样,就是尽量都走优化,既然都用到这个aiod.employee_id = #{maps.employeeId} ,就把他提出来,然后改造成这个样 ,1=1永远为true就是不再做筛选

 <if test="maps.employeeId != null ">
           AND aius.employee_id = #{maps.employeeId}
       </if>
        <if test="maps.employeeId != null ">
            AND CASE WHEN aio.no_use_asset_employee_join = 1 THEN (  1 = 1)
            ELSE ( aiod.employee_id = #{maps.employeeId} ) END
        </if>

思考:
就是不要把太多条件去放进CASE WHEN里面,这样会导致不走索引,只能单纯去比较就会很慢。尽量拆分出公共部分,尽可能去走索引查询。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

关于CASE WHEN造成的查询缓慢的生产问题思考 的相关文章

随机推荐

  • 手把手教你开发微信小程序自定义底部导航栏

    手把手教你开发微信小程序自定义底部导航栏 一 创建微信小程序 二 配置底部菜单 1 配置app json文件 增加底部菜单 三 增加自定义底部菜单 1 app json配置文件 tabBar 增加 custom true 2 添加导航图标
  • ethercard php_PHP如何通过编程在服务端验证以太坊签名

    以太坊有一个非常强大的JavaScript生态系统 有一些很棒的开源项目 比如ethereumjs util 它提供了一个用以太坊帐户签名的即插即用功能 JavaScript的一个缺点是 在许多领域 它带来了安全问题 一个这样的安全风险是显
  • Java多线程:解决高并发环境下数据插入重复问题

    1 背景描述 应用框架 Spring SpringMVC Hibernate 数据库 Oracle11g 一家文学网站向我系统推多线程低并发推送数据 我这边观察日志和数据库 发现有一个作者被存储了2次到数据库中 按照程序的编写逻辑 重复的数
  • CCF C³-24@中电金信:超级算力时代的新格局

    C 活动第24期主题 超级算力时代的新格局 将于2023年9月21日周四 16 30 19 30 在上海举行 报名从速 在深度数字化转型时代 随着算力需求增长和算力供给创新的双重叠加 简单算力供给正在演化为多元化算力供给 单体架构正在向云原
  • html在网页上显示不出,WKWebView 加载本地HTML显示不出网页问题,这点你注意了吗?-------完美显示...

    1 首先 WKWebView的引入和创建 我这里就不做阐述 我要说的 就是解决别人不能给您解决的问题 2 WKWebView 加载本地HTML 也就是两三句代码 是吧 作为读者的您肯定也知道 也实现了 就是如下代码 这里要说一下 为了做到正
  • Windows安装mysql服务

    Windows上同时安装两个mysql服务 一 下载两个版本的MySQL 进入官网下载 https www mysql com 二 将下载下来的压缩包放到合适的位置并且解压缩 2 1配置环境变量 2 2创建my ini文件 mysql 设置
  • AWS SAA-C03 #36

    A company is building an application in the AWS Cloud The application will store data in Amazon S3 buckets in two AWS Re
  • 前端第三方组件库官网

    前端第三方组件库官网 Vant Weapp 官网 https vant contrib gitee io vant weapp home Vant ui 官网 https vant contrib gitee io vant zh CN r
  • 面试官问你为什么离开上一家公司该怎么回答?

    相关文章 程序员面试必问 你为什么要离开上一家公司 你会怎么回答 面试官问你为什么离开上一家公司该怎么回答 是否被HR问过 你为什么离开上一家公司 总结 没有晋升空间 想找一个更大的舞台 上家公司的工作量不饱和 团队气氛不足 我是一个习惯加
  • 在VS2010进行MFC编程设置字符集的问题(使用多字节字符集引起错误)

    1 error C2664 WideCharToMultiByte 不能将参数 3 从 CString 转换为 LPC WSTR 参数3是m edit 2 error C2039 GetWindowTextW 不是 CComboBox 的成
  • moviepy音视频开发:音频剪辑基类AudioClip

    前往老猿Python博文目录 一 背景知识介绍 1 1 声音三要素 音调 人耳对声音高低的感觉称为音调 也叫音频 音调主要与声波的频率有关 声波的频率高 则音调也高 音量 也就是响度 人耳对声音强弱的主观感觉称为响度 响度和声波振动的幅度有
  • 时间序列分析和预测(含实例及代码)

    导论 研究时间序列主要目的 进行预测 根据已有的时间序列数据预测未来的变化 时间序列预测关键 确定已有的时间序列的变化模式 并假定这种模式会延续到未来 时间序列预测法的基本特点 假设事物发展趋势会延伸到未来 预测所依据的数据具有不规则性 不
  • C#窗体调用地图(高德地图)-实现公交线路查询

    C 窗体调用地图 高德地图 实现公交线路查询 新建C 工程 创建Windows窗体应用程序 添加WebBrowser控件 用来显示网地图页 可以把滚动条 ScrollBarsEnabled 设置成false给取消掉 更加的美观方便 使用高德
  • 刷脸支付成为下一个主流我们拭目以待

    智能刷脸支付已成为2019支付生态的风口 对于超市 便利店 企事业单位 停车场 餐厅等所有支付场景 越早加入刷脸支付 将享受越多的风口红利 刷脸支付 智慧医疗 智慧校园 智慧银行 餐饮超市酒店 无感停车场 各场景解决方案 软件定制开发 支付
  • 谷歌面试题解析: 扔鸡蛋的正确方式是什么?

    面试中 为了考察应聘者的思维方式 面试官偶尔会出一些谜题 Puzzles 比如 在谷歌 就有这样一道让人 闻风丧胆 的面试题 You work in a 100 floor building and you get 2 identical
  • 个人网站搭建记录

    个人网站地址 实际需要 云服务器 域名 网站备案 知识储备 node写一些后台接口 express mysql数据库 navicat连接数据库 mysql 常用终端命令行 https www jb51 net article 194140
  • hexo问题及解决

    1 推荐主题 butterfly 的默认 layout 很好 尤其对于内容比较多的 blog 安装方法如下 npm install hexo renderer pug hexo renderer stylus save npm instal
  • QMessageBox、QColorDialog、按钮汉化显示

    QMessageBox QColorDialog 按钮汉化显示 版本 Qt5 9 9 环境 QtCretator MinGW 在Qt源码目录下找到qt zh CN ts复制一份到工程目录 该文件在 G install Qt Qt5 9 9
  • 图像仿射变换shear怎么翻译?剪切、错切、推移哪个译词好?

    老猿Python博文目录 https blog csdn net LaoYuanPython 仿射变换博文传送门 带星号的为付费专栏文章 图像仿射变换原理1 齐次坐标来龙去脉详解 图像仿射变换原理2 矩阵变换 线性变换和图像线性变换矩阵 图
  • 关于CASE WHEN造成的查询缓慢的生产问题思考

    因为做的是类似SAAS的系统 关于同一个业务没会有不同的视角 有管理员 有类别分类的 有特别逻辑处理的 总而言之涉及到很多方面 再加上历史遗留问题导致导致的数据问题 这SQL写起来真的酸爽 除了简单的关联 还要考虑到一个效率问题 最近就因为