首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >第62篇-学习并分析“一次巧妙的SQL优化改写”

第62篇-学习并分析“一次巧妙的SQL优化改写”

作者头像
老虎刘
发布于 2022-06-22 10:02:12
发布于 2022-06-22 10:02:12
23400
代码可运行
举报
运行总次数:0
代码可运行

之前在手机上看到某公众号一篇标题为”一次巧妙的SQL优化改写“文章,深入浅出的分析了一个通过改写得到很大提升的案例(24分钟到1.86秒),非常不错。最近在电脑上重新分析这个案例时,又有新体会:

原SQL:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select count(*) 
from jbpm_testtest1 t
join jbpm_testtest2 pi
  on t.procinst_=Pi.id_
inner join ccform_testtest3 d
  on d.cf_id = pi.id_   
where ( t.end_= (select max(end_) 
                 from jbpm_testtest1 s
                 where s.procinst_=d.cf_id 
                       and d.cf_gdsta in ('K') 
                ) 
        or (t.end_ is null and t.isopen =1 )
       );

该文章最后给出的改写SQL:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
with V as
(select procinst_,max(end_) as max_end_ 
 from jbpm_testtest1
 group by procinst_
)
select 
      sum(case when (t.end_ is null and t.isopen=1) or 
                      t.end_ = v.max_end_ 
                     then 1 else 0 end) cnt
from jbpm_testtest1 t
join   jbpm_testtest2 pi
  on t.procinst_=Pi.id_
inner join ccform_testtest3 d
  on d.cf_id = pi.id_
left join v on 
 (d.cf_id=v.procinst_ and d.cf_gdsta in ('K')) 
;

这个改写看起来比较巧妙的地方是select 部分的sum case when,利用了只求count,不返回具体行列内容的特点,直接计算做sum。起优化作用的还是把where部分的标量子查询改成外关联。

我认为这个“巧妙改写“写成下面形式可能更易读一些,这种写法从性能上没有什么损失,如果要返回具体的结果集,也方便修改:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
with V as
(
 select procinst_,max(end_) as max_end_ 
 from jbpm_testtest1
 group by procinst_
)
select count(*)
from
( select t.procinst_,t.end_,t.isopen,d.cf_id,d.cf_gdsta,v.max_end_
    from jbpm_testtest1 t
    join jbpm_testtest2 pi
     on t.procinst_=Pi.id_
   inner join ccform_testtest3 d
     on d.cf_id = pi.id_
    left join v on 
     (d.cf_id=v.procinst_ and d.cf_gdsta in ('K')) 
) where (end_ is null and isopen=1) or (end_ = max_end_ )
;

如果我们再深入分析一下原的改写后的SQL,发现还有进一步提升效率的空间,即开头with部分的group by,其实是不需要的,去掉之后可以减少一次关联,下面是老虎刘给出的改写方法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select count(*) 
from
( select  t.procinst_,t.end_ , t.isopen,d.cf_id,d.cf_gdsta,
        max(end_) over (partition by t.procinst_) as max_end_
from jbpm_testtest1 t
join jbpm_testtest2 pi
  on t.procinst_=Pi.id_
inner join ccform_testtest3 d
  on d.cf_id = pi.id_
) where (end_ is null and isopen=1) or (cf_id=procinst_ and end_=max_end_ and cf_gdsta in ('K')) 
; 

不妥之处,欢迎指正。

(完)

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-06-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 老虎刘谈oracle性能优化 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Hive SQL优化思路
Hive的优化主要分为:配置优化、SQL语句优化、任务优化等方案。其中在开发过程中主要涉及到的可能是SQL优化这块。
五分钟学大数据
2021/12/27
2.1K0
优化案例:CASE WHEN进行 SQL 改写优化
本文介绍了如何利用MySQL数据库对某电商平台进行性能优化,通过合理设计数据表、索引、使用分页算法、合理设计表结构、使用缓存等技术手段,使电商平台在面临高并发、大数据量的场景下,仍能保持较高的性能,并减少数据库压力,提高系统的稳定性。
叶金荣
2017/07/03
2.3K0
MySQL经典50题:面试必备
标题 MySQL经典50题解析及答案 作者 Peter 微信 756803877 公众号 尤而小屋 时间 2021-09-02 MySQL经典50题解析及答案 下面是网传经典的MySQL50题的习题及参考答案💪,供参考和学习,有更好的方法或者不恰当的地方,欢迎提出来 <!--MORE--> 题目1 题目要求 查询"01"课程比"02"课程成绩高的学生的信息及课程分数 SQL实现 -- 方法1 select a.* ,b.s_score as 1_score ,c.s_score
皮大大
2021/09/02
1.9K0
MySQL经典50题:面试必备
SQL优化实战
数据库中一张表的大概有700多条记录,业务需要模拟一个类似属性树形的数据结构,需要查询所有父类的列表数据,查询出来符合记录的大概有400多条,目前测试点击查询,所需要的时间大概在4s多,这个效率实在太慢了;
田维常
2020/02/13
4970
记一次标量子查询SQL改写优化
最近有几个朋友都遇到了因为标量子查询(scalar subquery)导致SQL性能奇差的问题,前几天刚好给客户改写了一个,拿出来与大家分享。
老虎刘
2022/06/22
5420
记一次标量子查询SQL改写优化
比较经典的SQL面试题
我根据题目重新梳理了一遍,包括表结构,表之间的关系,测试数据,题目,参考答案等。其中大部分参考答案在各种数据库平台上通用。
jamesjiang
2022/11/20
9160
比较经典的SQL面试题
MySQL 经典30题,拿走不谢!!!
这里将开始我们的 sql 之旅,在这里希望对 sql 能力稍弱的同学,有一定的帮助。 如果大家在以下 sql 学习中,发现更具有优化性的建议,可以留言给小编或者加技术群交流,让我们一起成长。(底部有WeChat方式)
八点半的Bruce、D
2020/06/09
1.3K0
SQL之50个常用的SQL语句
50个常用的sql语句 Student(S#,Sname,Sage,Ssex) 学生表 Course(C#,Cname,T#) 课程表 SC(S#,C#,score) 成绩表 Teacher(T#,Tname) 教师表 问题: 1、查询“001”课程比“002”课程成绩高的所有学生的学号;  select a.S# from (select s#,score from SC where C#='001') a,(select s#,score  from SC where C#='002') b  wher
互联网金融打杂
2018/04/03
8090
SQL | 数据分析面试必备SQL语句+语法
前些天在网上冲浪的时候看到一个案例咨询,问说世界500强的数据分析要不要去,评论区一片爆炸:“楼主能分享一下文科生怎么转行做数据分析吗??”、“SQL、python这些学起来好痛苦!”我看着屏幕苦笑,数据分析岗位现在的热门程度如果要形容的话,基本就是随便抓一个微博网友都知道这个岗位了。
咸鱼学Python
2020/03/24
3.3K0
SQL |  数据分析面试必备SQL语句+语法
SQL学习笔记之SQL查询练习1
–1.学生表 Student(s_id,s_name,s_birth,s_sex) –学生编号,学生姓名, 出生年月,学生性别 –2.课程表 Course(c_id,c_name,t_id) – –课程编号, 课程名称, 教师编号 –3.教师表 Teacher(t_id,t_name) –教师编号,教师姓名 –4.成绩表 Score(s_id,c_id,s_score) –学生编号,课程编号,分数
Jetpropelledsnake21
2018/08/01
6410
【Mysql学习之旅-2】经典sql面试题及答案分析
1、学生表 student(s_id:学生id,s_name:学生姓名,s_birth:学生生日,s_sex:学生性别):
云深i不知处
2020/09/16
2K0
Flink SQL 优化
Flink SQL可以指定空闲状态(即未更新的状态)被保留的最小时间 当状态中某个 key对应的 状态未更新的时间达到阈值时, 该条状态被自动清理。
zeekling
2023/03/08
7600
Flink SQL 优化
SQL优化案例-从执行计划定位SQL问题(三)
当SQL出现问题,能从执行计划中快速的定位哪部分出现问题很重要,SQL文本如下(为保证客户隐私,已经将注释和文字部分去掉):
沃趣科技
2018/07/02
4780
SQL优化案例-从执行计划定位SQL问题(三)
做 SQL 性能优化真是让人干瞪眼
很多大数据计算都是用 SQL 实现的,跑得慢时就要去优化 SQL,但常常碰到让人干瞪眼的情况。
小小詹同学
2021/12/13
5830
Hive SQL经典优化案例
1.3 优化思路:既然将要执行的查询是按照 dt, strategy, ab_group, source 这4个字段分组, 那么在建表的时候,就按这四个字段中的N个(1 或 2 或 3 或4)个字段组合分区,直接让 count(distinct xx) 之类的查询定位到“更少的数据子集”,其执行效率就应该更高了(不需要每个子任务均从 7.7亿+ 的数据中(去重)统计)。
王知无-import_bigdata
2020/09/27
1.6K0
Hive SQL经典优化案例
做 SQL 性能优化真是让人干瞪眼
很多大数据计算都是用 SQL 实现的,跑得慢时就要去优化 SQL,但常常碰到让人干瞪眼的情况。 比如,存储过程中有三条大概形如这样的语句执行得很慢:
石臻臻的杂货铺[同名公众号]
2022/03/24
4530
做 SQL 性能优化真是让人干瞪眼
Activiti开发案例之工作流任务数据统计
工作流可以提高企业运营效率、改善企业资源利用、提高企业运作的灵活性和适应性、提高工作效率、集中精力处理核心业务、跟踪业务处理过程、量化考核业务处理的效率、减少浪费、增加利润、充分发挥现有计算机网络资源的作用。实施工作流将达到缩短企业运营周期、改善企业内(外)部流程、优化并合理利用资源、减少人为差错和延误,提高劳动生产率等目的。
小柒2012
2019/12/05
1.4K0
第61篇-必须通过改写SQL才能提升性能的一些情况
这篇文章介绍了一些需要通过改写才能提高性能的SQL写法,也是对本人以前公众号改写相关文章的一个总结(也有新内容)。同时也对网络上流传的一些不太准确的说法给予纠正。改写的首要任务是等价,其次才是性能的提高,不等价的改写危害更大。
老虎刘
2022/06/22
5080
第61篇-必须通过改写SQL才能提升性能的一些情况
hive优化大全-一篇就够了[通俗易懂]
1.概述   在工作中总结Hive的常用优化手段和在工作中使用Hive出现的问题。下面开始本篇文章的优化介绍。
全栈程序员站长
2022/08/03
2.2K0
hive优化大全-一篇就够了[通俗易懂]
SQL做数据分析的困境,查询语言无法回答的真相
SQL 被广泛用于数据分析,经常会被当成数据分析师的默认技能。的确,数据库环境下会写 SQL 是很方便,想查什么写句 SQL 似乎就能搞定。比如,查个用户分组销售额,SQL 写出来就像英语一样简单:
朱迪
2025/02/19
950
相关推荐
Hive SQL优化思路
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档