实现报表数据外置计算

Posted xiaohuihui-11

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了实现报表数据外置计算相关的知识,希望对你有一定的参考价值。

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

但是,报表并不能直接使用原始数据,都需要运算(比如查询汇总)之后再进行呈现,而文件本身没有计算能力,因此无法提供报表需要的结果。此外,使用文件存储的数据量一般都很大,仅靠报表呈现端很难实现高效的计算。

对于润乾报表来说,这种需求完全可以在内置集算引擎的帮助下做到,称为库外文件计算,或数据外置计算。所支持的文件类型包括:文本、Excel、JSON 格式文件等,还支持效率更高的二进制文件。

通过数据外置计算,将较大数据量的历史数据从数据库中剥离,除了可以满足历史查询类报表的性能需求外,还可以实现混合数据源(文件 + 数据库)的计算,进而实现大数据量的实时数据查询,比如从文件系统中读取往期大量的历史数据,从数据库中读取当期较小量的实时数据进行混合计算。由此,一方面可以避免数据库的 IO 瓶颈,快速提升报表性能,增大数据查询范围;另一方面,将历史数据移出,数据库可以专注于保证业务系统数据的一致性,而不是耗费资源在大量的历史查询任务上,这也是一种数据库优化的手段。

下面用一个例子说明润乾报表实现数据外置计算(结合集算器实现)的步骤:

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

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

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

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

当数据外置后,润乾报表可将文件作为数据源来设计报表,比如根据订单明细按客户统计订单数量和订单金额,由于原始订单数据非常大,所以读入文件时采用流式(文件游标)的方式逐步读入。

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

技术图片

脚本:

 A
1 =file(“E:/ 订单明细.txt”).cursor@t()
2 =A1.select(货主国家 ==county && 货主地区 ==area && 货主城市 ==city && 订购日期 >=begin && 订购日期 <=end)
3 =A2.groups(客户 ID;count( 订单 ID): 订单数量,sum(订单金额): 订单总额 )
4 return A3

代码说明:

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

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

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

A4:为报表返回结果集。

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

 A
1 =file(“E:/ 订单明细.txt”).cursor@t()
2 =A1.select(订购日期 >=begin && 订购日期 <=end)
3 =A2.groups(客户 ID;count( 订单 ID): 订单数量,sum(订单金额): 订单金额 )
4 =connect(“cmos”)
5 =A4.cursor(“select 客户 ID,count( 订单 ID) 订单数量,sum(订单金额) 订单金额 from 订单明细 where 货主国家 =? and 货主地区 =? and 货主城市 =? and 订购日期 >? and 订购日期 <? group by 客户 ID”,county,area,city,begin,end)
6 =[A3,A5.fetch()].conj()
7 >A4.close()
8 =A6.groups(客户 ID;sum( 订单数量): 订单总量,sum(订单金额): 订单总额 )
9 return A7

代码说明:

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

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

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

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

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

数据集配置如下:

技术图片

报表配置如下:

技术图片

通过以上过程可以清晰的看到,润乾报表可以通过数据外置提升报表性能,解决对往期历史 + 当期数据进行查询时性能不高的问题。

以上是关于实现报表数据外置计算的主要内容,如果未能解决你的问题,请参考以下文章

如何实现可自我迭代的计算机

实现报表数据预先计算

实现报表与算法的统一管理

如何解决报表关联计算中的性能问题

如何在报表中实现算法的可挂接需求

开发报表的先进工具