實現報表數據預先計算

報表應用中,若是數據量較大或計算過程較複雜,每每會致使報表數據源準備過慢,從而影響報表性能。這種狀況下能夠預先計算報表須要的數據,在呈現時直接引用,使得用戶在訪問報表時能夠迅速地得到響應。算法

1、當前的手段及弊端

因爲報表在訪問時經常須要參數,所以顯然不可能把全部參數組合對應的報表數據源都準備好,因此預先計算一般只生成中間數據,在呈現時仍然要再進行一些後續的簡單計算(如過濾、分組彙總、排序等)。不過即使如此,也不太可能徹底由報表工具在中間數據基礎上完成全部後續運算,所以報表工具一般只能完成一些小數據量的運算。也就是說,存儲的中間數據還須要有有再次計算的能力,因此通常狀況下會將中間數據以中間表的形式存儲在數據庫中,以便在呈現時再借用數據庫的計算能力。數據庫

採用中間表進行預先計算會存在如下弊端:首先,將過多的計算工做交給數據庫作,無疑會加大數據庫的壓力,甚至反而形成性能不升反降;其次,中間表太多容易致使管理混亂,因爲數據庫採用非層次結構(與文件系統的樹形結構不一樣),所以大量存在的中間表每每會增長數據庫管理難度。此外,從數據庫中讀取較大的中間表還會出現 I/O 瓶頸,一樣會致使報表性能不佳。數組

2、潤乾報表的解決方案

潤乾報表的預先計算方案(結合集算器實現)不須要使用數據庫中間表,從而能夠避免上述弊端。潤乾報表內置的運算引擎擁有完整的計算能力,一方面能夠將中間數據存放在文件中,另外一方面還能夠對文件進行再計算後做爲報表數據源,縮短報表計算時間,提高報表性能。工具

這種方式看上去和使用數據庫中間表相似,都須要事先計算準備數據,但也有很大的不一樣:第一,不會佔用昂貴的數據庫空間,不會增長數據庫負擔;第二,中間數據的組織管理基於文件系統,清晰明瞭;第三,數據量大時不會出現 IO 瓶頸。性能

潤乾報表可以作到這些,得益於內置了專門用於數據計算的集算引擎。集算引擎與文件系統可實現無縫交互(讀入和輸出),能夠讀取多種文件格式,如常見的文本、Excel 等,也包括效率更高的二進制文件,從而使文件具有再計算的能力,輕鬆實現報表預先計算。fetch

下面用一個例子說明潤乾報表進行預先計算的步驟:大數據

一、將須要的中間結果保存成文件優化

潤乾報表支持常見的文本文件格式,例如能夠將訂單明細分組彙總後的數據直接存放在文本(orderDetail.txt)中。若是但願提升性能,潤乾報表還支持更高效的二進制文件格式,比文本能快出 2-5 倍,在集算器中執行以下代碼就能將文本文件轉換成二進制格式文件。spa

file(「E:/ 訂單明細.b」).export@b(file(「E:/ 訂單明細.txt」.cursor())設計

固然,生成中間數據的過程自己也能夠採用集算器實現,但非本文關注點,此處再也不詳述。

二、 基於中間數據文件生成報表源

潤乾報表能夠直接基於文件進行再次計算,從而得到報表數據源,好比下面的過濾算法。

腳本中使用的參數及其含義以下:

imagepng

其中 cols 爲選出列名,where 爲過濾條件(參數傳遞時拼接成上述格式),num 爲取出的記錄數。

腳本內容:

  A
1 =file(「E:/ 最近 5 年訂單初步彙總.txt」).cursor@t(${cols})
2 =A1.select(${where})
3 =A2.fetch(num)
4 return A3

上述腳本基於文件進行過濾和分組彙總操做,其中:

A1:經過文件遊標(流式處理)讀入大文本數據,此處支持選擇列,用戶能夠根據參數控制選出的數據列。

A2:按照參數進行條件過濾,結果仍然是遊標。

A3:按照參數限制記錄數,取出遊標中的記錄。

A4:爲報表返回結果集。

上述腳本只處理了一箇中間文件,若是須要從多個文件同時查詢數據,腳本能夠這樣編寫(以 2 個爲例):

  A
1 =file(「E:/1996-1999 年訂單初步彙總.txt」).cursor@t(${cols})
2 =file(「E:/2000-2005 年訂單初步彙總.txt」).cursor@t(${cols})
3 =[A1,A2].conj@x()
4 =A3.select(${where})
5 =A4.fetch(5000)
6 return A5

其中中間數據文件按年份存儲,每 5 年一個。若是查詢 1996 到 2005 年間的數據,就須要讀取 2 個文件。腳本中 A3 對兩個文件的遊標進行了縱向拼接,合併成一個遊標,而後採用與第一個腳本相同的方式進行處理。當查詢的數據範圍繼續擴大,須要多個文件的時候,能夠經過循環的方式將多個文件遊標進行縱向拼接合並。

三、設計報表

這一步包括在潤乾報表中調用集算腳本,編輯報表表達式完成報表製做等等,這些是報表製做的常規動做了,再也不贅述。

與通常優化方式相似,使用預先計算來提升報表性能要充分考慮使用場景。對某些計算過程容易拆分的場景特別適合使用預先計算,如大表彙總數據與其餘表作鏈接,這時能夠先將大表彙總數據預先存成文件,再與其餘表作鏈接計算。此外,數據的實時性要求也須要充分考慮,好比在歷史查詢類的報表中就比較適合使用預先計算,固然潤乾報表還提供了其餘手段來保證數據的實時性要求。

總結一下,因爲通常報表工具不具有文件計算能力,所以要實現預先計算每每要藉助數據庫進行;而潤乾報表擁有完整的文件計算能力,能夠避免數據庫中間錶帶來的各類弊端,這一點對用戶極具實用價值。

相關文章
相關標籤/搜索