為什麼會有這麼多中間表?

2021-09-13 01:38:09 字數 2564 閱讀 4976

中間表是資料庫中專門存放中間計算結果的資料表。報表系統中的中間表是普遍存在的。那麼,這些中間表是如何出現的?為什麼中間表會越來越多?中間表會給專案組帶來什麼樣的困擾,如何解決這些困擾?這裡我們就嘗試**一下這個問題。

中間表出現的典型場景主要有三個:

一步算不出來。資料庫中的原始資料表要經過複雜計算,才能在報表上展現出來。乙個 sql 很難實現這樣的複雜計算。要連續多個 sql 實現,前面的生成中間表給後邊的 sql 使用。

實時計算等待時間過長。因為資料量大或者計算複雜,報表使用者等待時間太長。所以要每天晚上跑批量任務,把資料計算好之後存入中間表。報表使用者基於中間表查詢就會快很多。

多樣性資料來源參加計算。來自於檔案、nosql、web service 等的外部資料,需要與資料庫內資料進行混合計算時,傳統辦法只能匯入資料庫形成中間表。

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

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

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

很多情況下,專案組只好為了越來越多的中間表去擴容資料庫。但是資料庫的擴容成本太昂貴了:不管是換更強的伺服器(縱向擴容),還是增加資料庫伺服器的節點(橫向擴容),都不便宜。過於頻繁的擴容讓專案組非常頭疼。

那麼,能不能把中間表匯出到檔案中,從而減輕資料庫的壓力呢?這個辦法初看挺好,但是有個問題始終無法解決。例如:每天晚上把經營分析表資料生成好之後放到檔案中,第二天上班的時候發現,業務人員還要對經營分析表按照各種條件過濾,或者按照各種維度分組。因為檔案本身是沒有計算能力的,一旦把中間表從資料庫中匯出成檔案就很難進一步計算了。不得已,只能把中間表繼續留在資料庫中。

採用潤幹集算器實現檔案計算,就可以把中間表從庫中遷移到檔案系統中了。採用集算器的前後對比圖如下:

在集算器結構中,資料庫的大量中間表都移到了庫外,資料庫僅僅儲存少量原始資料表,壓力就小了很多。針對這些中間表實現的多個 etl 儲存過程、觸發器、複雜 sql 也都由集算器來實現,資料庫的計算壓力也變小了很多。雖然計算和儲存壓力由應用伺服器來承擔,但是成本還是要比資料庫伺服器低很多。專案組不用再每隔一段時間就申請資料庫伺服器擴容了。

同時,集算器可以讀取多樣性資料來源,直接參與混合計算。無需再匯入資料庫,成為中間表。

移到庫外的資料檔案不能再使用 sql 計算了,換成集算器會不會增加編寫的難度呢?實際上,集算器編寫簡單計算指令碼的時候和 sql 差不多,複雜多步驟計算還要比 sql 容易。例如: a

1=file(「d:/report/hr/employee.b」)

2=a1.import@b()

ab1=file(「order_books.b」).import@b()

=a1.select(amount>=20000 && month(date)==3)

ab1=file(「order_books.b」).import@b()

=a1.select(amount>20000)

2=a1.groups(salesid, month(date); sum(amount), count(~))

從上述例子來看,採用集算器實現資料檔案庫外計算,學習成本很低,很容易掌握。

新方案的價值還不僅僅是降低資料庫的壓力。

對於報表應用而言,中間資料的存在是有價值的:有些中間表是報表業務決定的,有些是為了彌補現有技術的不足。也就是說,中間資料和報表模板一樣,都是報表系統的一部分。所以,集算器的方案並沒有讓中間資料消失,只是移到了庫外,儲存在報表應用的檔案目錄中,使得中間表在物理上也成為了報表應用系統的一部分。這樣既能發揮中間資料的價值,還可以讓中間資料和報表系統的其他部分一起管理。顯然,檔案系統的樹形目錄結構比資料庫混在一起的幾萬個表要更容易維護。

在實際專案中,可以給中間資料檔案建立多層資料夾儲存。例如:第一層目錄是財務管理、人力資源、erp 等等。人力資源又有子目錄:工資管理,基本資訊,黨員資訊等等。目錄可以細化到某個報表,如果該報表發生了變化,只需要調整這個目錄中的報表模板或者資料檔案即可。如果該報表廢棄不用,那麼刪掉或者移走報表所在目錄,就可以快速的釋放硬碟空間。

從計算速度來說,由於檔案更底層,更接近於磁碟,io 效能要好於資料庫。所以集算器的方案可以為報表系統帶來更快的效能。

報表資料來自於多樣性資料來源時,還可以有更好的實時性,不像傳統手段時只能定期入庫。

為什麼會有這麼多中間表?

中間表是資料庫中專門存放中間計算結果的資料表。報表系統中的中間表是普遍存在的。那麼,這些中間表是如何出現的?為什麼中間表會越來越多?中間表會給專案組帶來什麼樣的困擾,如何解決這些困擾?這裡我們就嘗試 一下這個問題。中間表出現的典型場景主要有三個 一步算不出來。資料庫中的原始資料表要經過複雜計算,才能...

外部表讀取速度 為什麼會有這麼多中間表?

中間表是資料庫中專門存放中間計算結果的資料表。報表系統中的中間表是普遍存在的。那麼,這些中間表是如何出現的?為什麼中間表會越來越多?中間表會給專案組帶來什麼樣的困擾,如何解決這些困擾?這裡我們就嘗試 一下這個問題。中間表出現的典型場景主要有三個 一步算不出來。資料庫中的原始資料表要經過複雜計算,才能...

為什麼南通的方言會有這麼多?

這個世界上,有種厲害叫做 結棍 有種醜態叫做 來頭醜 有種非常叫做 沒得魂 有種爺爺叫做 嗲嗲 有種外公叫做 尾嗲嗲 有種閒話叫做 嚼區子 這一段是曾經的南通朋友們編出來的對於南通方言的調侃,在網上廣為流傳。長久以來,南通話都有個外號,叫做 難懂話 曾經南通有一道方言考察試題,問的是 褲子瓦拉,褲多...