【性能优化】4.8 [遍历技术] 冗余分组键
4.8 冗余分组键
有时为了方便处理,数据表中会有些冗余的字段。比如订单表里可能有客户编号同时也有客户名称,而客户名称完全可以由客户编号确定,客户名称就是冗余的信息。这种数据结构在多维分析后台的宽表中并不罕见。
如果我们要针对客户分组汇总,通常把客户编号作为分组键,因为客户名称有可能重复,而结果集中也希望把客户名称列上,这样就要把客户名称也作为分组键的一部分。在 SQL 中确实也经常这么写。
但这样就会加大计算量。分组过程中,分组键值的计算与对比是重要的计算量。多一个分组键,在计算哈希值和比对时都会复杂很多,导致性能下降。
SPL 允许把这种冗余的分组键作为汇总值写到汇总参数中,不必做这些不必要的计算。
A |
|
1 |
=file("orders.btx").cursor@b() |
2 |
=A1.groups(cust_id;cust_name,sum(amount)) |
没有聚合函数的汇总参数,被认为是冗余的分组键将从当前分组子集随便取一个作为聚合值。在这里,cust_name 不会参与分组键的计算,但结果集中还是能把它计算正确。
数据仓库中设计冗余字段主要是为了避免难以优化的连接运算,于是用空间换时间。我们在后面章节中会讲述 SPL 中如何高效实现这类连接,而不必生成有冗余字段的宽表(被遍历表字段更少反而会提高运算性能)。冗余分组键的处理在 SPL 的实践中很少用到,一般只是在迁移和复制传统数据仓库运算时才会应用。