百万级分组大报表开发与呈现

在《秒级展示的百万级大清单报表怎么作》中,咱们介绍了不管 RDB 仍是非 RDB,润乾报表都可以经过异步线程实现秒级海量大清单报表(如下简称:大报表)。实际业务中,除了查询明细,有时还要展示全量汇总数据,或者查询分组明细和计算分组汇总。本文就将介绍这些带有汇总和分组的大报表的开发方法。html

带汇总的大报表

       在大报表中计算汇总值与常规报表基于报表内数据进行的汇总不一样,大报表因为采用异步线程,所以没法经过报表内数据进行汇总(由于每次只能取到部分数据),只能在数据处理阶段计算汇总值并交给报表呈现。数据库

咱们仍是使用《秒级展示的百万级大清单报表怎么作》中 SQL 源大报表的例子,如今须要在每页最后一行显示订单汇总状况(订单数量、订单总额、运费总额)。segmentfault

制做报表模板

       增长一个数据集 ds2 计算汇总值:并发

     报表中最后一行引入 ds2 汇总值进行呈现,这里为了每页都包含汇总数据,设置最后一行属性为报表尾。异步

       固然,带有汇总的大报表性能跟计算汇总值的 SQL 执行效率强相关,因此可能会发现带有汇总的大报表要比单纯查询明细慢一些。函数

分组大报表

       实际业务中,简单呈现大报表清单每每还不够,有时还须要对海量数据进行分组,呈现汇总及明细状况。下面,咱们就以订单数据为例,查询一下按地区分组的明细及订单金额汇总。高并发

需求分析

       首先,须要呈现分组明细的报表没法在数据源端进行聚合,例如经过 SQL 聚合后就不包含分组明细了,除非再查询一次进行拼接,但查询两次显然会严重影响性能。所以咱们须要尽可能将明细数据读出后在应用端进行分组聚合。性能

       那问题就来了,因为海量数据要经过分批读取的方法进行呈现,如何保证读取的每批分组数据是完整的?若是分组数据不完整,分组聚合的结果显然也就不正确了。所以,除了要保证能在应用端实现聚合,还要保证批量读取数据时分组数据的完整性。fetch

       下面就是润乾报表结合集算器(数据集)实现分组大报表的过程。大数据

报表数据准备

       咱们须要编写集算器 SPL 脚本进行数据准备。这里,咱们要编写两个 SPL 脚本,分别实现:查询分组明细并计算汇总,以及经过游标分批为报表返回结果集。

SPL 脚本 1:group-detail.dfx

设置脚本参数:

编写 SPL 脚本:

图片描述
SPL 解析:

一、 A2 查询数据库,SQL 中指定按照分组字段(货主地区)排序,以便后续能够每次取出整个分组进行汇总。为此须要在排序字段上创建索引,避免全表排序时间过长。

二、 A3 循环游标,以货主地区为标记,保证每次读取的记录数为一个地区数据

三、 B4 增长标志位,用于后续报表展示中突出汇总行。标志为 0 时表示是明细记录

四、 B5 针对每一个分组进行汇总

五、 B6 将分组值追加到明细记录中,标志设为 1,表示是汇总记录

六、 B7 返回分组明细和汇总集合。注意这里 return 写在循环内,所以会屡次返回分组集合

关于 for cs,n;x 用法

在集算器 SPL 脚本中,for cs,n;x 表示针对游标 cs 经过循环遍历数据,每轮从游标读取 n 条记录或者直到记录中的 x 发生变化,循环所有结束后关闭游标。大数据量的分组取数是这种循环的经常使用之处。若是省略了 n 和 x,那就简单地返回游标中全部数据并关闭游标。函数的具体说明能够参考:http://doc.raqsoft.com.cn/esproc/func/forcsnx.html

       当大数据集按照分组字段有序时,这种取数方式每次能够读取一个完整分组到内存中参与计算,不过这时仍然要求分组不能很大(内存能装下)。而在金融和电信行业中,常常要基于单用户作数据分析,也就是按用户分组,而每一个用户的流水记录规模又较大,常规的拆分方法做起来十分复杂。而经过集算器就能够很好地解决这类问题了。

SPL 脚本 2:main.dfx

设置脚本参数:

编写 SPL 脚本:

图片描述

       前一个 SPL 脚本 group-detail.dfx 解决了分组查询明细并汇总计算的问题。这个脚本 main.dfx 则能够分批次取数并提供给润乾报表,从而实现异步大报表呈现。脚本中 A1 经过 cursor 函数直接调用前一脚本生成游标,由 A2 将游标返回给报表。

关于 cursor() 函数

       使用 cursor 函数调用 SPL 脚本生成游标时,被调用的 SPL 脚本能够有多个返回结果集(例如在 for 循环中的多个 return),而游标取数(fetch)时能够依次使用多个 return 结果,无需等待全部结果集都准备好再使用,原理以下图所示。函数的具体说明能够参考:http://doc.raqsoft.com.cn/esproc/func/cursordfx.html

结合大报表使用 cursor() 函数运行原理

设计报表模板

设置报表参数,查询起止日期:

设置数据集引用 main.dfx 并传递日期参数:

       按照大报表模板设计思路,编写表达式

为了将汇总行高亮显示出来,这里利用了数据准备阶段增长的标志位 flag 列,当 flag 值为 1 的时候表明该行为汇总行,设置背景色表达式:if(A3==1,-3355444)

设置大数据集

发布到 WEB

       将作好的模板发布到 WEB 端,效果以下:

固然,标志位 flag 列也能够设置为隐藏。

效果调整

       调整报表模板,将标志位 flag 列隐藏,并设置 B3 格的扩展属性 同值合并为“纵向合并”

展示时分组列则带有合并格的效果:

注意事项

       在《秒级展示的百万级大清单报表怎么作》中,咱们提示了大报表不要全表排序,也不适合高并发场景。除此之外,对于带有分组汇总和明细的大报表还应该注意:

单个分组不宜过大

       因为计算分组明细和汇总值时须要将某一个分组数据所有加载到内存中进行计算,所以分组相对内存容量不宜过大,从而确保单个分组数据能进行全内存计算。

相关文章
相关标签/搜索