将数据放至数据库外或文件系统来提高报表系统性能

         在报表应用中,针对历史数据查询的报表占比很大,这类报表的特点是:第一,数据变化小,查询的历史数据几乎不会发生变化;第二,数据量大,数据量随时间跨度增大而不断增加。如果数据始终存放在数据库中,由于大多数数据库的JDBC性能都很低下(JDBC取数过程要做数据对象转换,比从文件中读取数据会慢一个数量级),这时涉及数据量较大或在并发较多的时候,报表的性能会急剧下降。如果能将这些变化不大的历史数据移出数据库,采用文件系统存储,将可能获得比数据库高得多的IO性能,从而提高报表的整体性能。

         但是,报表并不是直接使用原始数据进行呈现,还需要做进一步的运算。而文件本身没有计算能力,这种情况数据量一般也较大,不可能靠报表呈现端的计算能力实现。

         集算报表在内置集算引擎的帮助下可以基于库外文件做计算,支持的文件类型包括:文本、ExcelJSON格式文件等,还支持效率更高的二进制文件。将较大数据量的历史数据从数据库中剥离,这样除了可以满足历史查询类报表的性能需求外,还可以借助集算报表对混合数据源(文件+数据库)的支持,进行大数据量的实时数据查询,从文件系统中读取往期较大的历史数据,从数据库中读取当期较小的实时数据进行混合计算。这样的做法可以避免数据库的IO瓶颈,快速提升报表性能,增大数据查询范围。同时,这也是优化数据库的过程,将历史数据移出,数据库可以专注于保证业务系统数据的一致性,而不是耗费资源在大量的历史查询任务上。

         具体使用上,当用户将数据保存到文件系统中后,即可使用集算报表进行数据查询和计算,集算报表内置的集算引擎可以基于文件(和数据库)进行数据计算。使用时,可以参考如下步骤(举例说明):

1 将数据库中历史数据导出到文件

用户可以自行选择适当的方法将历史数据导出到文件,当然这个过程也可以使用集算器来做,可以将数据导出到文本,如果希望更高的性能,集算报表还可以支持更高效的二进制文件格式(比文本能快出2-5倍)。在集算器(用免费版本即可)中执行类似如下代码可将文本文件转换成二进制格式。

file("E:/订单明细.b").export@b(file(“E:/订单明细.txt”.cursor())

 

2 使用集算报表内置的集算引擎读取数据文件

当数据外置后,采用集算报表就如同使用文件数据源做报表了,比如根据订单明细数据按客户统计订单数量和订单金额,由于原始订单数据非常大,所以读入文件时采用流式(文件游标)的方式逐步读入。

脚本中使用的参数及其含义如下:



 

脚本:



 

A1:通过文件游标采用流式处理的方式读入大源文本数据;

       A2:按照指定的多个维度进行数据过滤,结果仍然是游标;

       A3:根据选出的结果,按照客户ID汇总订单数量和订单金额;

        A4:为报表返回结果集。

        

         如前面提到的,集算报表既可以针对单独的文件(历史数据)进行查询计算,还可以进行文件+数据库混合运算,进行大数据量实时查询。



   
A1-A3:与上一个脚本一样,汇总历史数据;

        A5:根据指定参数执行sql,汇总当期数据;

        A6:将两部分汇总数据合并(纵向拼接);

        A7:根据合并后的历史和当期汇总数据再次汇总,得到各客户的订单数量和订单金额。

 

3 在集算报表中调用集算脚本,编辑报表表达式完成报表制作

 

         通过以上的过程可以清晰的看到,集算报表可以很好解决针对往期历史(+当期)数据进行查询时往往存在性能不高的问题,通过数据外置提升报表性能。

猜你喜欢

转载自datamachine.iteye.com/blog/2184098
今日推荐