中間表是什么?和報表有什么關系?會帶來怎樣的問題?又如何解決?


在數據庫中有一類用於保存中間計算結果的物理表,通常被稱為“中間表”。中間表主要跟 OLAP(在線聯機分析)業務有關,產生的原因主要有以下幾方面。

imagepng

中間表來源

1. 計算邏輯復雜
在 OLAP(報表或查詢)業務中,有些計算邏輯很復雜,每次都從頭寫會導致報表開發過於繁瑣,而且有的計算用 SQL 很難寫出來。這時會采用中間表事先計算好,再基於預計算的中間結果開發報表。

計算邏輯復雜常見於報表業務中,以固定報表最為常見;多維分析則比較少見。

2. 查詢性能差
當查詢涉及的數據量很大或者計算邏輯很復雜時查詢性能會很差。為了提升查詢性能,增強用戶體驗,通常會把匯總結果實現計算出來存儲在中間表中。基於預匯總的中間表查詢速度會快很多。

在實際業務中,大部分提升查詢速度的中間表也都是為報表服務的。

3.ETL 過程轉存
ETL 過程也會產生中間表。ETL 過程中常常會涉及到數據庫的數據,正常的 ETL 過程應當是 E、T、L 這三個步驟逐步進行,也就是先清洗轉換之后再加載進數據庫,最后在數據庫中的只是合理的結果數據。但是,E(清洗)和 T(轉換)這兩個步驟中會涉及到大量數據計算,而在數據庫外實施這些計算很不方便,所以實際情況就會是把涉及到的所有數據都先加載進來然后再進行清洗和轉換,ETL 過程變成了 ELT 甚至 LET。事先要加載的這些數據在關系數據庫中也必須以表的形式存儲,這就使數據庫中增加了許多並非最終需要的中間表。

如果觀察一下這些跑批任務,你會發現 ETL 任務很多都是為報表業務服務的。

4. 多樣性數據源混合計算
另一種情況是多樣性數據源造成的,這也是為數據呈現(報表查詢)服務的。現代應用中的數據呈現經常會涉及數據庫外的數據,目前一般的做法是把庫外數據定時導入到數據庫中,然后就能和數據庫內的數據一起運算產生報表,否則很難實現數據庫內外的數據的混合運算。這當然也會讓數據庫中多了一些表,而且,有些互聯網上取過來的數據常常是多層的 json 或 XML 格式,在關系數據庫中還要建立多個關聯的表來存儲,會進一步加劇中間表過多的問題。

通過列舉的 4 個中間表產生的主要原因,我們發現一個共同點:中間表大部分情況都是為報表服務的。我們也知道,實際業務中的報表數量非常多,而且報表業務業務不穩定經常會新增修改報表,這會導致中間表數量不斷增多。

中間表會帶來哪些問題

中間表是一把雙刃劍,提供很多便利的同時也會帶來一些問題。

我們曾在一個運營商的報表系統中,發現了一個讓人吃驚的現象。在 DB2 數據倉庫中,有兩萬多個數據庫表!經過深入了解發現,真正的原始數據表只有幾百張,剩下的大量的數據庫表都是為查詢和報表服務的中間表。

像這種系統經過幾年乃至十幾年的運行,數據庫中的中間表越來越多,甚至出現這種上萬個的情況並不少見。大量中間表帶來的直接困擾是數據庫存儲空間不夠用,面臨頻繁的擴容需求。中間表對應的存儲過程、觸發器等等需要占用數據庫的計算資源,也會造成數據庫的擴容壓力。

中間表過多還會帶來管理方面的問題,對於成千上萬張中間表想要梳理清楚恐怕是一件非常頭疼的事情。

那么,是不是可以清理掉一些不用的中間表?一般的結論都是:搞不動。數據庫中的中間表是不同程序員制作的,有的是綜合查詢系統使用,有的是報表系統使用。中間表之間還存在交叉引用,有些程序員看到有別人生成的中間表就直接使用了。有時候一些查詢報表已經廢棄不用了,但是對應的中間表沒人敢刪,因為不知道刪掉之后會影響其他什么查詢或者報表。

很多情況下,項目組只好為了越來越多的中間表去擴容數據庫。但是數據庫的擴容成本太昂貴了:不管是換更強的服務器(縱向擴容),還是增加數據庫服務器的節點(橫向擴容),都不便宜。

總結來說,中間表會帶來管理、容量和性能三方面的問題。

如何解決中間表的問題?

可以很容易想到的方式是使用庫外文件存儲中間表數據,這樣中間表脫離了數據庫就不會對數據庫再產生影響。但是,在實際應用中這種辦法卻很少使用。為什么呢?

我們知道,中間表是要再計算的,基於中間表查詢的報表還要進行數據過濾,有的還要再次匯總,還可能涉及關聯計算,這些操作在數據庫里通過 SQL 完成很簡單。但是文件沒有計算能力,要實施這些計算只能硬編碼,用 JAVA 來做,使用 JAVA 來做集合運算又非常麻煩,遠沒有數據庫(SQL)方便。所以采用文件存儲中間表的方式使用並不廣泛,主要是由實現復雜度過高導致的。

那還有什么好的方式呢?

使用支持文件源的報表工具
既然中間表大部分是為報表服務的,而通過將中間表外置到文件中可以解決中間表帶來的這些問題,那么直接使用支持文件源的報表工具是否就可以了呢?

答案是肯定的。

我們來看一下要實現這個目標,報表工具要具備哪些能力?

(1) 豐富的計算類庫
要解決文本計算難的問題,報表工具要提供豐富的計算類庫,除了能完成所有數據處理任務(都能算)以外,還要實現簡單,這是基礎,太復雜了沒法用;

(2) 多樣性數據源接口
支持多樣性數據源以后,就可以不用通過數據庫中轉直接讀取多樣性數據源數據出報表;

(3) 異構數據源混合計算能力
提供多樣性數據源接口后,還要能夠進行異構源間的混合計算,這樣就可以徹底解決掉多樣性數據源帶來的中間表問題;

(4) 高性能
除了實現簡單以外,計算性能也要有保障,從而滿足前端報表查詢的性能需要。

具體實現上可以在報表工具中增加計算模塊來對接“庫外中間表”,結構類似這樣

imagepng

其中庫外中間數據文件可以采用本地文件,也可以使用網絡或分布式文件系統,或其他數據源。

要解決中間表問題,需要報表工具強化自身的計算能力才能實現!

參考資料:
【數據蔣堂】第 14 期:計算封閉性導致臃腫的數據庫
【數據蔣堂】第 15 期:開放的計算能力為數據庫瘦身
有效減少數據庫中間表的報表開發方法
為什么會有這么多中間表?


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM