【性能优化】8.2 [多维分析] 时间段预汇总

 

【性能优化】8.1 [多维分析] 部分预汇总

8.2 时间段预汇总

对于时间段上的统计,使用一些技巧后就可以利用预汇总数据了。

假如原始数据表是按日存储的数据,那么我们可以按月做好预预汇总数据,当需要针对一个时间段统计时,可以将时间段跨过的整月数据从预汇总数据中读取并再汇总,再从原数据表中读出时间段两头那两段不构成整月的日期的数据,再汇总到一起即可获得查询目标。这样,可以将长时间段统计的计算量减少十倍甚至更多。

比如,我们要查询 1 月 22 日到 9 月 8 日区间的某种统计值,而事先已经按月准备过预汇总数据。那么我们可以基于预汇总数据计算 2 月到 8 月的汇总值,再使用原始数据表计算 1 月 22 日到 1 月 31 日和 9 月 1 日到 9 月 8 日的聚合值,涉及的计算量是 7(2 月 -8 月)+10(1 月 22 日 -1 月 31 日)+8(9 月 1 日 -9 月 8 日)=25。如果使用原始数据表聚合,其计算量是 223(从 1 月 22 日到 9 月 8 日的天数),几乎减少了 10 倍。

这里说的原始数据表,也可以是某个细粒度的预汇总数据。

SPL 已经实现了这种方法,在 cgroups 函数上增加条件参数就可以:


A

1

=file("orders.ctx").open()

2

=A1.cuboid(file("day.cube"),dt,area;sum(amount))

2

=A1.cuboid(file("month.cube"),month@y(dt),area;sum(amount))

3

=A1.cgroups(area;sum(amount);dt>=date(2020,1,22)&&dt<=date(2020,9,8); file("day.cube"),file("month.cube"))

如果发现有时间段条件和更高层次的预汇总数据,SPL 则会使用这种方法来减少运算量。本例中,就会分别从预汇总文件 month.cube 和 day.cube 中读取相应数据再来汇总。

时间段预汇总技术实质上是在解决切片(切块)问题。

【性能优化】8.3 [多维分析] 冗余排序
【性能优化】 前言及目录