天天看點

Cube優化原理

Cube優化原理

首先要先了解Cuboid生成樹。如圖1所示,在Cube中,所有的Cuboid組成一個樹形結構,根節點是全次元的Base Cuboid,再依次逐層聚合掉每個次元生成子Cuboid,直到出現0個次元時結束。圖1中綠色部分就是一條完整的Cuboid生成路徑。預計算的過程實際就是按照這個流程建構所有的Cuboid。

Cube優化原理

圖1 Cuboid生成樹

通過這顆Cuboid生成樹,我們不難發現:當次元數量過多,就會導緻Cuboid數量以指數級膨脹;如果次元基數過大,還會使所在的Cuboid結果集變大。這些都是影響Cube膨脹率和建構時間的重要因素。

但是,所有的Cuboid都是必要的嗎?實際上,在多數情況下,我們并不需要這裡的每一個Cuboid,是以需要對Cuboid生成樹做剪枝。剪枝可以從兩個方面入手:資料特性、查詢需求。首先介紹資料特性,考慮下圖2的兩個Cuboid,左側Cuboid包含4個次元(ABCD),右側Cuboid包含3個次元(ABC),而兩個Cuboid都包含相同(或極度相近)行數的記錄,說明讀取兩個Cuboid結果的代價是一樣的,同時左側Cuboid除了具有右側Cuboid的查詢支援能力外,還能支援帶有次元D的查詢,是以右側Cuboid就可以被去除。

Cube優化原理

圖2 去除備援Cuboid

再考慮查詢需求,在報表或多元分析場景中,有些次元是每次查詢都會出現的,如年份;有些次元總是一起出現的,如開始時間、結束時間;有些次元間是有層級關系的,如商品分類或地理資訊。充分利用查詢的這些實際需求也能去除不需要的Cuboid,例如:如果年份是必要的,那麼所有不包含年份次元的Cuboid都可以被去除;如果兩個次元總是同時出現,那麼這這些次元單獨出現的Cuboid就可以被去除。

在Apache Kylin中,可以通過設定Cube的次元組合規則來去除無用的Cuboid。首先,可以通過定義聚合組對次元分組,隻在每個聚合組内生成Cuboid。此外,在單個聚合組内部,還可以設定次元組合規則,如:必須次元用于定義一定出現的次元、聯合次元用于定義一組同時出現的次元、層級次元用于定義一組有層級關系的次元,詳細的Cuboid生成規則如下圖3所示:

Cube優化原理

繼續閱讀