实现报表数据外置计算

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

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

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

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

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

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

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

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

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

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

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

脚本:

  A
1 =file(“E:/ 订单明细.txt”)[email protected]()
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”)[email protected]()
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 在润乾报表中调用集算脚本,编辑报表表达式完成报表制作

数据集配置如下:

报表配置如下:

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

原文地址:https://www.cnblogs.com/xiaohuihui-11/p/12096880.html

时间: 2024-08-22 19:30:03

实现报表数据外置计算的相关文章

报表系统结构优化之中间数据外置

绝大多数报表项目的数据库中,除了支撑系统运行的业务数据表之外,还有很多中间表.业务数据表是报表系统必须的基础数据表,是支持报表系统运行的持久化数据层,例如:销售报表系统中的订单.客户.产品等等.报表中间表则是计算和生成报表的中间计算过程,中间表的名字经常是五花八门. 按道理说,业务数据表应该是大部分,报表中间表只是小部分.但是,实际情况却恰恰相反.有些运行了较长时间的报表系统中,报表中间表达到几千个或者更多,而业务数据表只有一两百. 关系型数据库的综合成本是和数据表的数量.数据量相关的.数据库中

用集算器实现报表的外置存储过程数据源效果

业务逻辑相对复杂的报表开发中,开发人员往往会使用存储过程为报表准备数据.而使用存储过程往往受到编写困难.执行效率低下.数据库操作权限限制等问题,着实让开发人员不爽.如何改进或替代存储过程,成了很多程序员的心心声. 本文通过一个例子说明如何使用集算器实现报表存储过程数据源效果. 报表样式 某网络平台需要监测查看一定周期内的用户状况,需要为运营部门出具日报.周报.月报.年报等报表,每类报表中均包含本期与上期.上上期数据比较,故涉及数据量较大.这里以其日报为例(月报年报只是统计周期不同),报表格式如下

用Jasper report来实现交叉报表的增长率计算

来源:     http://community.jaspersoft.com/questions/847490/how-get-annual-growth-rate-crosstab 交叉表的每一列都是动态生成的,进行列间计算时需要动态引用,用Jasper脚本实现此类需求有一定难度,用集算器在数据准备阶段实现则相对简单,下面用例子来说明. 数据库表store存储着多种产品在2014.2015年的销售量,需要用交叉表呈现每种产品每年的销售量,并计算出各产品的年增长率.部分源数据如下: 集算器代码

报表应用的计算中间层

在传统的报表应用中,源数据的计算一般有三种方式:1.报表工具直接连接数据库取数,源数据的计算是提交SQL由数据库完成的:2.报表工具利用自身的计算能力(单元格函数或格间计算),实现部分数据计算:3.报表工具通过API调用Java程序实现数据计算. 下面,我们比较一下这三种方式,并探讨最佳方案. 首先,来看数据库计算. 数据库计算的优势是:数据一致性较好,安全性较高. 但是,采用数据库计算报表源数据的问题也比较多:1.报表工具从数据库中取出数据时,要通过JDBC,因为需要做数据流的对象转换,所以关

如何使用活字格搭建报表数据中心系统?

黑龙江珍宝岛药业股份有限公司(以下简称珍宝岛)是生产高端中药制剂产品的现代化制药企业,是黑龙江民营企业用的标志性单位. 项目背景和需求 1. 企业多系统并存,需要对数据进行整合和规范 通过二十年发展,珍宝岛现已成为国内有相当影响力的药业集团.近十年来,在公司主管部门努力下,基础信息系统财务系统.营销系统.人力资源系统以及OA系统等已经建设完成.多系统运行就伴随着信息孤岛的诞生,各个系统间数据规范不统一,无法联合运用.且在各部门,还有大量规范的EXECL表格在运行.如何使数据规范统一,消除信息孤岛

如何实现报表数据的动态层次钻取(二)

上一篇<如何实现报表数据的动态层次钻取(一)>介绍了利用复杂 sql 实现动态层次结构的方法,但该方法依赖 Oracle 的递归语法,在其他类型的数据库中难以实现.要想通用地实现此类报表,可以使用下面介绍的“集算脚本 + 本地文件”的方法. <各级部门 KPI 报表>的格式和具体要求参见上一篇文章.有所不同的是,报表数据源从数据库表变为本地文件:tree.b(树形结构维表)和 kpi.b(指标事实表),数据示例如下图: Tree 文件数据 Kpi 文件数据 说明:Tree 的叶子节

实现报表数据的可控缓存

使用缓存可以提升报表性能是一个共识,一般高端报表工具都会提供报表缓存功能,将整个报表计算结果缓存在文件系统中,以便用户下次访问参数相同的报表时可以快速读取缓存结果进行展现.润乾报表作为报表工具的领军品牌,当然也具有这种常规的缓存功能. 但在有些情况下,报表开发人员还希望进一步控制缓存的内容,比如对于缓存内容,可能只想缓存一部分而不是整个报表结果,或者能够让其它报表或程序复用缓存内容,又比如对于超时设置,可能希望为不同的缓存结果设置不同的超时时间.这些需求都来自于实际业务中需要应对的数据量和实时性

实现报表数据分库存储

报表项目中,常常会出现报表源数据来自不同数据库的情况,也就是同一张报表可能会从多个业务系统读取数据.例如:员工信息从人力资源系统中取出,销售数据从销售系统中取出.当然,还有一种可能,同一应用系统的数据库负载太大,不得已分成多个数据库,例如:销售系统数据分成当前库和历史库. 在数据库类型方面,报表工具可能连接同样类型的数据库,比如都是 oracle 或者 db2:也可能是不同的类型. 报表应用中针对这种数据分库存储的解决办法有两种:1.建设专门的数据仓库:2.利用跨库访问的技术. 专门数据仓库的建

数据汇总计算和分析的反思

以下内容,都经过本人实践验证过. 若转发,请在标题上标记[转],并注明原文链接:http://www.cnblogs.com/robinjava77/p/6285747.html,作者名称:robin. 并在文章首行附上本段话.否则,作者保留追究的权利. 术语定义: 1.片:本周.本月.本年.近两月.近三月.近半年.近一年和至今八个维度 诉求:基于**年的日数据,进行计算汇总,分别以本周.本月.本年.近两月.近三月.近半年.近一年和至今八个维度进行统计精准性修复,时间消耗越低越好. 场景: 1.