在报表应用中,针对历史数据查询的报表占比很大,这类报表的特点是:第一,数据变化小,查询的历史数据几乎不会发生变化;第二,数据量大,而且还会随时间不断增加。如果这些历史数据始终存放在数据库中,由于大多数数据库的 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 在润乾报表中调用集算脚本,编辑报表表达式完成报表制作
数据集配置如下:
报表配置如下:
通过以上过程可以清晰的看到,润乾报表可以通过数据外置提升报表性能,解决对往期历史 + 当期数据进行查询时性能不高的问题。