報表系統效能提公升之預先計算

2021-06-28 01:44:31 字數 2417 閱讀 1928

報表應用中當資料量較大或計算過程較複雜時,會導致報表資料來源準備過慢,從而影響報表效能。這時常常需要事先將報表需要的資料計算好,在呈現時直接引用即可,這樣使用者在訪問報表時就可以迅速地獲得響應。

由於報表在訪問時還需要引數,顯然不可能把所有引數組合對應的報表資料來源都準備好,所以預先計算並不是最終的報表結果,在呈現的時刻仍然要再次進行一些簡單的計算(如過濾、分組彙總、排序等),然而也不太可能指望報表呈現時刻由報表工具再完成所有這些運算(報表工具只能完成一部分小資料量的運算),這樣就要求儲存的中間資料有再次計算的能力。所以一般情況下會將中間資料採用中間表的形式儲存在資料庫中。

但是,使用中間表會加大資料庫負擔,將過多的計算工作交給資料庫做,無疑會加大資料庫的壓力,有時反而會造成效能不公升反降;而且,中間表太多還容易導致管理混亂,由於資料庫採用非層次結構(與檔案系統的樹形結構相比),大量存在的中間表往往會引起資料庫管理難題;此外,資料量稍大從資料庫中讀取資料還會出現i/o瓶頸,導致報表效能表現不佳。

集算報表的預先計算方案不需要使用資料庫中間表,從而可以避免上述弊端。集算報表內建的運算引擎擁有完整的計算能力,可以允許中間資料存放在檔案中,報表使用中間結果檔案再次計算得到報表資料來源,從而縮短報表計算時間,提公升報表效能。

這種方式與使用資料庫中間表有些類似,都需要事先計算準備資料,但也有很大的不同:第一,不會占用昂貴的資料庫空間,不會增加資料庫負擔,第二,不會引起資料庫組織混亂,第三,資料量大時不會出現io瓶頸。集算報表之所以能夠完成預先計算並將結果儲存在檔案中,得益於集算報表內建了專門用於資料計算的集算引擎及其與檔案系統的無縫互動(讀入和輸出),可以讀取多種檔案格式,如常見的文字、excel等,也包括效率更高的二進位制檔案,從而使檔案具備再計算的能力,實現報表預先計算。

具體使用上,集算報表允許將部分甚至全部中間計算結果儲存到檔案中,報表被訪問時通過使用者給定的引數,基於結果檔案再次計算最終將報表資料呈現給使用者。使用集算報表進行預先計算可以通過如下步驟實現(舉例說明):

1、將需要的中間結果儲存成檔案

中間結果計算好後可存成檔案,集算報表可以支援常見的文字檔案格式,例如將訂單明細分組彙總後的資料存放在文字(orderdetail.txt)中,如果希望更高的效能,集算報表還可以支援更高效的二進位制檔案格式(比文字能快出2-5倍)。在集算器(用免費版本即可)中執行如下類似的**可將文字檔案轉換成二進位制格式。

file("e:/訂單明細.b").export@b(file(「e:/訂單明細.txt」.cursor())

當然,生成中間資料的過程本身也可以採用集算器,但非本文關注點,此處不詳述。

2、 基於中間資料檔案生成報表源

集算報表可以直接基於檔案資料來源進行再次計算,得到報表資料來源,以過濾為例。

指令碼中使用的引數及其含義如下:

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

指令碼內容:

上述指令碼是基於最近5年訂單初步彙總的中間結果進行過濾和分組彙總操作,其中:

a1:通過檔案游標採用流式處理的方式讀入大源文字資料,此處支援選擇列,使用者可以根據引數控制選出的資料列;

a2:按照指定的多個維度進行資料過濾,結果仍然是游標;

a3:根據指定的選出結果數量,使用游標取出記錄;

a4:為報表返回結果集。

上述指令碼是處理的乙個中間結果檔案,如果需要從多個檔案中同時查詢資料,指令碼可以這樣編寫(以2個為例):

由於中間資料檔案是按年份儲存(每5年乙個),如果要查詢1996到2023年間的資料,需要讀取2個檔案,指令碼中a3對兩個檔案的游標進行了縱向拼接,合併成乙個游標,然後採用與第乙個指令碼相同的方式進行處理。當查詢的資料範圍繼續擴大,需要多個檔案的時候,可以通過迴圈的方式將多個檔案游標進行縱向拼接合併。

3 、在集算報表中呼叫集算指令碼,編輯報表表示式完成報表製作,這是報表製作的常規動作了,不再贅述。

與一般優化方式類似,預先計算也有其適用的場景。使用預先計算來提高報表效能要充分考慮計算的型別,對某些計算過程容易拆分的場景比較適合使用預先計算,如經常要對某些大表彙總資料後與其他表做連線,這樣就可以先將大表彙總資料預先計算出來儲存,再與其他表做連線計算;還有資料的實時性要求也要充分考慮,比如在歷史查詢類的報表中就比較適合使用預先計算,當然開發人員也可以採用其他手段來保證資料的實時性要求。

一般報表工具不具備針對檔案的計算能力,要實現類似的效果往往要借助資料庫進行,使用資料庫的中間表會存在開篇我們提到的幾點問題,有時會適得其反,從這個角度也充分體現了集算報表的價值。

系統效能提公升 AHCI

最近總是感覺自己的電腦越來越慢。於是想優化一下,可是普通的軟體優化已經達到了極限,精簡系統又不是我的風格。於是開始像硬體方面去找找問題。於是發現了個好東西 ahci。ahci serial ata advanced host controller inte ce 序列ata高階主控介面 高階主機控制...

高併發系統設計二 如何提公升系統效能

我們需要有度量的指標,有了資料才能明確目前存在的效能問題,也能夠用資料來評估效能優化的效果。響應時間控制在多久比較合適呢?從使用者體驗的角度來說 健康系統的 99 分位值的響應時間通常通知在 200 ms 之內,不超過 1s 的請求佔比要在 99.99 以上。1 提公升系統的處理核心數 增加系統的並...

log4j2 提公升系統效能

其中,log4j log4j2 logback commons logging都是日誌的具體實現包。其中,slf4j是乙個門面,乙個介面卡,所有的日誌 都可以用slf4j來寫,它會根據專案具體依賴的日誌實現包進行日誌操作。通過slf4j寫日誌的好處是,當更換日誌的實現方案時,無需修改日誌 只需修改p...