存在汇总统计等功能的大数据量报表的优化方案

大象从不倒下 2011-04-21

对于大数据量,多层分组的的汇总报表不能采用分页标签,可以采用如下的优化方案:

一、先初步对报表进行优化:

1、尽量在sql实现group分组,数据库虽然要进行分组运算,但是数据库中有索引,运算速度快,且取到报表服务器端的记录数大大减少,取数速度大大加快,因此在报表端进行分组运算的时候只要对很少的记录数进行,报表的运算速度大大加快了。

2、修改背景色的表达式尽量少采用row(),比如在每一行的一个格子里算出来行号,然后在背景色表达式判断。背景色的奇偶行判断,比如:if(row()%2==0,-3342337),主要是row(),是因为这种函数无法优化计算,有多少个表达式就要计算多少次,而且必须在扩展完后拖后计算。这样的话,如果扩展比较多的话,对性能就会有比较大的影响。

3、对于交叉分组要尽量减少数据集个数,尽量用单数据集。

二、配置优化:

以JVM内存设置为1G的服务器为例子,假设并发量最大为5,用户请求的报表为200单元格*1000页(数据量可能上千万,但通过条件查询,最其中几千条记录),一般大数据量都没有图片,所以以每一个单元格为0.5k计算,那么在最大并发量下,得出报表系统内存使用量为:200*1000*5*0.5/1024K=488.28125M根据以上计算,我们在实际生产系统中,我们建议:

cachedReportTimeout设置成180分钟,用户数据量大的情况下,增大报表缓存时间。

alwaysReloadDefine设置为no,开启缓存,这样客户在翻页时,不再与数据库交互,减轻数据库服务器的负担。

同时在tag标签中把useCache设置为yes。

timeout可以根据自己的实时要求进行设置,如果数据一天都不会变的话,建议设置为-1。

maxConcurrentForReport为5,即并发量为5。

maxWaitForReport设置为10,即等待队列里允许的最大报表量。

maxWaitTimeForReport设置为300秒钟,6分钟内得不到响应,用户需要再次请求。

maxCellNum,在内存中,同时计算的单元格数量建议为200单元格*500页=100000格。

如果不能用缓存,可以将缓存开关关掉,重点关注一下并发和最大格子数的设置。

另外,报表里,报表属性-格子数,这个属性可以写成这样的表达式:ds1.count()*13,如果还有一些固定格子,可以写成ds1.count()*13+固定格子数.

相关推荐