最近,生产环境发现一个一览的查询,导出excel,发现超过300条数据就没有办法导出,我被安排来解决这个问题,当时我的想法是,300条数据不算多,也不是动态导出EXCEL,要么是SQL需要优化,要么代码的写法有问题。
根据我自己的想法,我便开始做了分析,看了一下原来的代码实现,有如下点:
- 使用了HQL来全表查询
- 对于字典值全部是在service里面调用共通方法的sql来转义
- 在service里面对于全表数据转义后的结果中相关字段进行了加密
我的分析方法:
在好几处调用的地方,我都打印了时间,然后看一下是哪一块耗时比较多,着重对那一块进行优化。
我发现在HQL将数据查出来之后,在service进行字典转义的时候耗时很多,甚至会卡死在这里。之所以是在这里出问题,因为要循环list,然后对每个元素进行判断,一个vo就有100多个属性,这样就比较耗时。
我的解决方法:
不采用原来直接用HQL的方法,而是采用纯SQL,在SQL中尽量将数据字典进行转换,我查了一下数据量大的时候,SQL耗时也不是很多,觉得这种方案可行,所以我就修改了原来的代码。
最后在生产环境进行测试,顺利通过,而且效率也高了不少。其中我看了一下一览画面也就只有8个字段显示,然而原来的代码也是直接HQL,查询所有字段,但是在画面的字典比较少,没有出现问题。但是我个人还是比较倾向于,用SQL,只查询需要的字段,不需要的字段不用查找,这样数据库查询方面的性能会有所改善。
最后想说的是,有的可以共通的东西可以通过参数之类的进行控制,避免冗余代码,但是不要为了简单,就随便的进行全表查询,这样比较耗时。