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

bubblegum發表於2020-07-21

在資料庫中有一類用於儲存中間計算結果的物理表,通常被稱為“中間表”。中間表主要跟 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

其中庫外中間資料檔案可以採用本地檔案,也可以使用網路或分散式檔案系統,或其他資料來源。

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

參考資料:



來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69900830/viewspace-2703526/,如需轉載,請註明出處,否則將追究法律責任。

相關文章