有人在技术讨论群里提出下面一个业务逻辑代码段:
这段代码的业务逻辑是找到2019年业务量最多的61秒(我想本意应该是60秒,代码不够严谨)间隔及业务量。
这个业务题主用plsql完成,是比较典型的程序员思维,执行效率明显是非常低的,我给出的建议是可以直接按to_char(date_created,'yyyymmdd hh24mi')做group by,再找出最大值,sql写法比较简单,相信大部分开发人员应该都能够简单写出。
但是题主又补充了其他需求,说还可能需要按不同的时间间隔做统计,比如15秒间隔,30秒间隔等。
针对这种需求,我给出的SQL写法如下(以15秒间隔为例):
题主对两种写法做了性能对比,1000多万记录,我提供的写法耗时125秒,原plsql写法耗时1371秒(这个速度是无法接受的),效率相差10几倍,如果数据量再大,效率差别也会更大,而且优化后的sql还可以使用并行,还能提速。
上面的查询,间隔的起点是固定的,这种写法还不是太复杂。如果我们再把这个问题延伸一下,比如查一年内哪个连续10天的业务量最高,sql相对就复杂一些,下面是我给出的写法:
上面是一些使用分析函数的两个小案例,大家可以参考一下。同时,使用with的CTE写法会让sql的层次比较清晰,增强代码的可读性。
如果你有更好的写法,不妨在留言写出来,让大家一起学习一下。
本文分享自 老虎刘谈oracle性能优化 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!