记录工作上一次计算的优化
一.背景描述:
1.有一个定时任务,共有4个步骤,每天跑T-1的数据,获取两种设备的运行数据并计算。这里称计算任务1,在第3步中:
- 获取8万左右的设备1,每次循环2000个设备,循环中查询设备1表的运行数据,每次查询4次,计算相关数据,并存入另一张表
- 获取6千左右的设备2,每次循环2000个设备,循环中查询设备2表的运行数据,每次查询2次,计算相关数据,并存入另一张表
2.查询设备1表查询4次获取的数据简要说明(以一个设备为例):
- 查1个设备近一年的数据
- 查1个设备近前一年的数据
- 查1个设备当前的数据,获取最大数据
- 查1个设备当年的数据,获取年数据
3.查询设备2表查询2次获取的数据简要说明(以一个设备为例):
- 查1个设备当前的数据,获取最大数据
- 查1个设备当年的数据,获取年数据
4.生产环境数据库本身问题,性能不佳,导致查询比较慢
5.设备1表的运行数据表每天8万数据,数据体量逐渐增加,更使得查询变慢
6.重点:
- 查询设备1表近一年的数据和前一年的数据是为了算最大的特征数据1
- 查询设备1表当前的数据,是为了算最大的特征数据2
- 查询设备2表当前的数据,是为了算最大的特征数据3
二.优化思路
2.1针对最大的特征数据1的优化
- 有取最大的特点:近一年最大和近前一年最大
- 最大的特征数据1又分近一年最大和近前一年最大,这两个最大的值由两个值相乘得到,这里简称最大分项1,最大分项2,近一年最大和近前一年的分项是一样的,只是范围不同
- 近一年最大和近前一年时间是滑动的,比如今天是24年10月29号,那跑任务的话,就是2023.10.28-2024.10.28,到了明天24年10月30号,跑任务的话,就是2023.10.29-2024.10.29
- 近一年最大和近前一年最大时间,左右端点都是滑动的
基于这样的场景,考虑:
- 初始化一次近一年最大和近前一年两个分项的值,简称初始化表1。存365个(或366个)最大分项1和最大分项2,以逗号分割,然后在定时任务的时候,只需要取T-1一天的数据,然后和初始化表中的数据比较,哪个大取哪个,然后剔除近一年集合的第一位,把大的值放到最后。这样就减少了2次大的查询
- 新增一个定时任务(这里简称定时任务2)每天获取T-2的数据,更新初始化表的两个分项逗号分隔的集合,和上面说到的一样,取T-2一天的数据,然后和初始化表中的数据比较,哪个大取哪个,然后剔除近一年集合的第一位,把前面剔除掉的近一年集合的第一位放到这里的末尾。
- 对于前一年两个分项也是如此。
这是一个示例图
通过这样的方式,正常情况下能保证初始化表1的数据正确,定时任务中取数计算也无误。
2.2针对最大的特征数据2、3的优化
- 有取最大的特点:今年最大
- 每天定时任务都取新的范围的最大
- 两个最大指标:最大运行数据,最大运行数据的日期
- 时间范围左端点是固定的,右端点是滑动的
基于这样的场景,考虑:
- 初始化一次两种设备最大运行数据,最大运行数据的日期。简称初始化表2
- 在定时任务的时候,只需要取T-1一天的数据,然后和初始化表中的数据比较,哪个大取哪个
- 新增一个定时任务每天获取T-2的数据,和初始化表中的数据比较,哪个大取哪个,更新初始化表的最大运行数据,最大运行数据的日期
通过这样的方式,正常情况下能保证初始化表2的数据正确,定时任务中取数计算也无误。
三.优化前
1.计算任务1第3步 执行耗时较久,一般要4 个小时甚至更久
2.整个计算任务 执行超过12 个小时,导致定时任务超时失效。
四.优化后
1.计算任务1执行稳定在1.5小时左右
2.定时任务2稳定在6小时左右,一般只需要初始化一次
五.思考和心得体会
1.当时这个优化思路是领导提的,我并没有意识到这一点,由此可以看出认识特定场景和洞悉问题的能力还有待提高。这个算法并不复杂,重要的是发现场景的规律,才能更好的解决问题
2.优化是否合理,应该经过较为确切的推敲和验证
3.优化是否有效,在论证优化合理后,在生产环境发布再得以验证