巧用集算器数据集
看如下图所示报表:
这个报表从样式来看,可以看作是一个简单的网格式报表,统计着各种收支金额,但因为取数复杂,每个格子的数据都来自一个复杂的 sql 数据集,并且涉及十几个,乃至几十个数据集,蓝色 区域里每个格子都需要从各自的数据集里检索遍历,查找与左表头关联的记录。为了方便体会这一点,我们将上图报表简化一点,如下图所示:
C1,D1 单元格都分别从 ds2,ds3 中取数,并通过关联条件与 B1 关联,诸如这样十几个数据集在报表端的遍历、关联,如果遇到大数据量,大的并发,速度就会受到影响,并且这也只适合一对一的情况,如果遇到一对多的情况,就无法如此运用了。
所以,如果这些数据集能整合为一个数据集,所有的关联都放在数据集里去处理,那么报表端的计算就变得灵活简单的多,但是 sql 数据集去完成这个拼接比较困难,也会很慢,集算器数据集正好能完成这个工作,速度也会大幅度提升,解决思路如下:
1. 通过 fork 多线程取数,并行堵出每一个数据集
eg:
2. 通过 join/align 完成每个数据集的横向拼接
eg: =join@l(A3(1):amount1, 订单 ID;A3(2):amount2, 订单 ID;A3(3):amount3, 订单 ID)
- 通过 new 返回一个数据集
eg: =A5.new(amount1. 订单 ID,amount1. 订单金额,amount2. 数量,amount3. 回款额)
以上只是提供一个思路,具体运用哪个函数,哪个选项,还需要根据实际数据合理选择,集算器函数具体用法请参考《集算器函数参考》。
除此之外,像常见的需要用于汇总统计的原始数据量非常大,报表并不大的情况,如果每次生成报表都需要现算,一方面非常慢,另一方面数据库的压力会很大,此时传统办法可以采用存储过程数据集对数据预先进行一次压缩,生成中间表,然后再基于中间表生成报表,可以大大提高运算速度并减轻数据库的压力。但是存储过程如果脚本过于复杂,那么后期维护比较麻烦,而且数据处理的灵活性也受限,这个时候用集算器数据集或者脚本数据集来处理数据,就方便的多。