记一次针对excel导出的优化(实际开发遇到的情况)

简介:

数据表里数据只存储年,月,月份数据,然后下载导出时候还需要我们导出年份统计数据。

正常情况下,我们是会取出数据,然后数据处理,处理过程一般是:循环遍历然后在循环里拿到每一条数据的主键,再从表里group by得到年份统计数据,

SELECT sum(valueOfMonth)  from XX where projectCode= xx and year = xx 

存放在循环体list里,最后数据处理完成,导出。

但是,处理过程执行sql,如果导出100万条数据,100万次循环处理过程会执行100万次sql,会导致速度奇慢无比而且可能内存溢出。

优化:

上面问题是执行sql次数太多,我们想要执行1次sql,取出我们想要的年份数据,然后数据处理时把对应projectCode的年份数据赋值就行,不需要每次循环里都去sql查年份数据。

那如何只通过1次sql就能得到所有年份数据是这个优化的关键

 SELECT projectCode,year,sum(valueOfMonth)  from XX GROUP BY  projectCode,year

得到年度统计数据,存放map里,map.put(projectCode+year,sum(valueOfMonth))
然后导出数据循环遍历里拿到每一条数据的projectCode和year,再从map里直接get(projectCode+year)得到年份统计数据,这样对数据处理就替代了执行sql重新去查年度数据

总结:

适当用map存储数据替代万次的sql查询,当然这只是可能会遇到的一种情况,优化前需要问题定位,至于其他情况我们遇到再说。

补充:

收藏几个自己觉得不错的帖子,仅供自查:

链接: 记一次 Java 导出大批量 Excel 优化
链接: 如何优化大数据量Excel导出的性能问题

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值