【性能优化】8.2 [多维分析] 时间段预汇总
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 中读取相应数据再来汇总。
时间段预汇总技术实质上是在解决切片(切块)问题。