实现报表数据预先计算

报表应用中,若是数据量较大或计算过程较复杂,每每会致使报表数据源准备过慢,从而影响报表性能。这种状况下能够预先计算报表须要的数据,在呈现时直接引用,使得用户在访问报表时能够迅速地得到响应。算法

1、当前的手段及弊端

因为报表在访问时经常须要参数,所以显然不可能把全部参数组合对应的报表数据源都准备好,因此预先计算一般只生成中间数据,在呈现时仍然要再进行一些后续的简单计算(如过滤、分组汇总、排序等)。不过即使如此,也不太可能彻底由报表工具在中间数据基础上完成全部后续运算,所以报表工具一般只能完成一些小数据量的运算。也就是说,存储的中间数据还须要有有再次计算的能力,因此通常状况下会将中间数据以中间表的形式存储在数据库中,以便在呈现时再借用数据库的计算能力。数据库

采用中间表进行预先计算会存在如下弊端:首先,将过多的计算工做交给数据库作,无疑会加大数据库的压力,甚至反而形成性能不升反降;其次,中间表太多容易致使管理混乱,因为数据库采用非层次结构(与文件系统的树形结构不一样),所以大量存在的中间表每每会增长数据库管理难度。此外,从数据库中读取较大的中间表还会出现 I/O 瓶颈,一样会致使报表性能不佳。数组

2、润乾报表的解决方案

润乾报表的预先计算方案(结合集算器实现)不须要使用数据库中间表,从而能够避免上述弊端。润乾报表内置的运算引擎拥有完整的计算能力,一方面能够将中间数据存放在文件中,另外一方面还能够对文件进行再计算后做为报表数据源,缩短报表计算时间,提高报表性能。工具

这种方式看上去和使用数据库中间表相似,都须要事先计算准备数据,但也有很大的不一样:第一,不会占用昂贵的数据库空间,不会增长数据库负担;第二,中间数据的组织管理基于文件系统,清晰明了;第三,数据量大时不会出现 IO 瓶颈。性能

润乾报表可以作到这些,得益于内置了专门用于数据计算的集算引擎。集算引擎与文件系统可实现无缝交互(读入和输出),能够读取多种文件格式,如常见的文本、Excel 等,也包括效率更高的二进制文件,从而使文件具有再计算的能力,轻松实现报表预先计算。fetch

下面用一个例子说明润乾报表进行预先计算的步骤:大数据

一、将须要的中间结果保存成文件优化

润乾报表支持常见的文本文件格式,例如能够将订单明细分组汇总后的数据直接存放在文本(orderDetail.txt)中。若是但愿提升性能,润乾报表还支持更高效的二进制文件格式,比文本能快出 2-5 倍,在集算器中执行以下代码就能将文本文件转换成二进制格式文件。spa

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

固然,生成中间数据的过程自己也能够采用集算器实现,但非本文关注点,此处再也不详述。

二、 基于中间数据文件生成报表源

润乾报表能够直接基于文件进行再次计算,从而得到报表数据源,好比下面的过滤算法。

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

imagepng

其中 cols 为选出列名,where 为过滤条件(参数传递时拼接成上述格式),num 为取出的记录数。

脚本内容:

  A
1 =file(“E:/ 最近 5 年订单初步汇总.txt”).cursor@t(${cols})
2 =A1.select(${where})
3 =A2.fetch(num)
4 return A3

上述脚本基于文件进行过滤和分组汇总操做,其中:

A1:经过文件游标(流式处理)读入大文本数据,此处支持选择列,用户能够根据参数控制选出的数据列。

A2:按照参数进行条件过滤,结果仍然是游标。

A3:按照参数限制记录数,取出游标中的记录。

A4:为报表返回结果集。

上述脚本只处理了一个中间文件,若是须要从多个文件同时查询数据,脚本能够这样编写(以 2 个为例):

  A
1 =file(“E:/1996-1999 年订单初步汇总.txt”).cursor@t(${cols})
2 =file(“E:/2000-2005 年订单初步汇总.txt”).cursor@t(${cols})
3 =[A1,A2].conj@x()
4 =A3.select(${where})
5 =A4.fetch(5000)
6 return A5

其中中间数据文件按年份存储,每 5 年一个。若是查询 1996 到 2005 年间的数据,就须要读取 2 个文件。脚本中 A3 对两个文件的游标进行了纵向拼接,合并成一个游标,而后采用与第一个脚本相同的方式进行处理。当查询的数据范围继续扩大,须要多个文件的时候,能够经过循环的方式将多个文件游标进行纵向拼接合并。

三、设计报表

这一步包括在润乾报表中调用集算脚本,编辑报表表达式完成报表制做等等,这些是报表制做的常规动做了,再也不赘述。

与通常优化方式相似,使用预先计算来提升报表性能要充分考虑使用场景。对某些计算过程容易拆分的场景特别适合使用预先计算,如大表汇总数据与其余表作链接,这时能够先将大表汇总数据预先存成文件,再与其余表作链接计算。此外,数据的实时性要求也须要充分考虑,好比在历史查询类的报表中就比较适合使用预先计算,固然润乾报表还提供了其余手段来保证数据的实时性要求。

总结一下,因为通常报表工具不具有文件计算能力,所以要实现预先计算每每要借助数据库进行;而润乾报表拥有完整的文件计算能力,能够避免数据库中间表带来的各类弊端,这一点对用户极具实用价值。

相关文章
相关标签/搜索