前同事交接留下一个expansion rate244%,cube size高达400G的超大cube,且报表中包含多条查询时长超过20s的SQL语句,报表彻底瘫痪无法打开。经过多次血泪尝试,终于将cube size缩小到80+G基本满足查询需求,并总结了以下kylin cube优化原则。
Advanced Aggregation GROUP
首先来说一下AAG中三种规则的含义。
Mandatary rules. 必要的字段。group_by或是filter中常用的字段。
Hierarchy rules. 结构字段。按父子关系从前往后依次排列字段。
Joint rules. 同时出现的字段。可以是扎堆出现的字段,也可以把所有不常用但又不能舍弃的字段都塞在joint rules里。是有效优化cube的方法。
在优化400G巨型cube中我犯了一个错误,一心一意想减少不必要的字段于是从AAG中剔除了所有仅作为筛选器使用、非group by的字段。这些筛选器字段中,有几个小基数但频繁作为筛选条件查询的字段,每个值包含上千万行的数据量,导致使用这些字段做为Where条件的SQL查询超时。解决办法就是:将这些小基数但数据量巨大的字段也纳入到AAG中。
所以呢,设计AAG时也不要太严苛了,less is more。
RowKeys
字段顺序影响查询速度,哪些字段要往前放呢:
Mandatory字段
频繁查询的字段
高基数的字段