多維分析預匯總的方案探討

發布時間:2019-03-07 分類:數據蔣堂 Tag:,,

我們在《多維分析預匯總的存儲容量》中計算過,如果想做到O(1)的復雜度,至少要考慮界面用到的各種維度組合,這在維度總量稍多一點時就不可行了。


這樣,我們就只能放棄O(1)復雜度的期望了,不把每種可能出現的維度組合都預匯總出來,只能預匯總部分維度組合。在查詢時,對于已經有預匯總的數據則可以直接返回,而如果碰到沒有預匯總的維度組合時,則仍然從原始CUBE遍歷聚合出來,這時的計算復雜度要么O(1)要么O(n)。

還可以做得更聰明一點:從某個已有的中間CUBE聚合。比如,如果保存了維度組合[A,B,C]的預匯總數據,那么維度組合[A,B]或[B,C]的查詢就可以從這個中間CUBE再聚合出來了,而不必從原始CUBE聚合,計算量將會大大降低。有時可能會有多個中間CUBE都能聚合出目標查詢,比如組合[A,B,C]和[B,C,D]都可以再聚合出組合[B,C],這時優先選擇數據量較小的那個中間CUBE即可。

那么,我們怎么知道在初始狀態時該預先匯總哪些組合呢?

可以動態生成這些組合。在查詢時,無法從現有中間CUBE聚合出來的組合只能從原始CUBE聚合,我們可以在聚合完成后將結果保存起來作為一個新的中間CUBE。發現新組合時第一次訪問會有延遲感,以后基于這個組合的查詢或者可由該組合聚合出來的查詢就都可以較快返回了。

其實,也不是只要能從現有中間CUBE聚合出來的組合就總是臨時聚合。多維分析性能優化的目標是前端反應速度,如果中間CUBE仍然很大,那么再聚合也會比較慢,這時候,這些再聚合的結果也可以作為一些新的中間CUBE保存起來。

另外,在過程中我們還可以記錄每個中間CUBE的使用頻率,在空間總量限制下,刪除那些使用率較低的中間CUBE,從而更有效地利用有限的空間。

經過這些處理后,我們雖然無法完全做到O(1)復雜度,但常常也能把計算性能從全量硬遍歷提高幾十倍甚至上百倍,這對于大多數多維分析場景已經足夠了。


我們還在《多維分析預匯總的功能盲區》中說過幾種情況無法通過預匯總來提高性能。其中非常規聚合和組合聚合本質上仍然是個數據量的問題,而對于臨時產生的條件測度和時間段統計,就不是數據量的問題了,我們無法預測用戶使用時才輸入的參數,也就不可能把所有參數對應的數據都事先預匯總出來。

理論上還可以使用上面的辦法:碰到新的參數就計算并保存下來。但與維度組合不同的是,測度參數常常是連續量,其取值及組合情況不可枚舉,重復利用的可能性不大。

預匯總對于條件測度確實難有好的效果,不過,對于時間段統計,還是有點招的。我們可以將數據按更高的時間維度層次預匯總,在查詢時就可以減少遍歷計算量。

假如原始CUBE是按日存儲的數據,那么我們可以按月把數據先做好匯總成中間CUBE,當需要針對一個時間段統計時,可以將時間段跨過的整月數據從中間CUBE中遍歷,再加上時間段兩頭那兩段不構成整月的日期的數據,即可以獲得查詢目標。這樣,可以將長時間段統計的計算量減少十倍甚至更多。

比如,我們要查詢1月22日到9月8日區間的某種統計值,而我們事先已經按月做過預匯總。那么我們只要基于預匯總數據計算2月到8月的聚合值,再使用原始CUBE計算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倍。

 

更多《數據蔣堂》文章
广西快乐十分