將資料放至資料庫外或檔案系統來提高報表系統效能,報表系統效能
在報表應用中,針對曆史資料查詢的報表佔比很大,這類報表的特點是:第一,資料變化小,查詢的曆史資料幾乎不會發生變化;第二,資料量大,資料量隨時間跨度增大而不斷增加。如果資料始終存放在資料庫中,由於大多數資料庫的JDBC效能都很低下(JDBC取數過程要做資料對象轉換,比從檔案中讀取資料會慢一個數量級),這時涉及資料量較大或在並發較多的時候,報表的效能會急劇下降。如果能將這些變化不大的曆史資料移出資料庫,採用檔案系統儲存,將可能獲得比資料庫高得多的IO效能,從而提高報表的整體效能。
但是,報表並不是直接使用未經處理資料進行呈現,還需要做進一步的運算。而檔案本身沒有計算能力,這種情況資料量一般也較大,不可能靠報表轉譯端的計算能力實現。
集算報表在內建集算引擎的協助下可以基於庫外檔案做計算,支援的檔案類型包括:文本、Excel、JSON格式檔案等,還支援效率更高的二進位檔案。將較大資料量的曆史資料從資料庫中剝離,這樣除了可以滿足曆史查詢類報表的效能需求外,還可以藉助集算報表對混合資料來源(檔案+資料庫)的支援,進行大資料量的即時資料查詢,從檔案系統中讀取往期較大的曆史資料,從資料庫中讀取當期較小的即時資料進行混合計算。這樣的做法可以避免資料庫的IO瓶頸,快速提升報表效能,增大資料查詢範圍。同時,這也是最佳化資料庫的過程,將曆史資料移出,資料庫可以專註於保證業務系統資料的一致性,而不是耗費資源在大量的曆史查詢任務上。
具體使用上,當使用者將資料儲存到檔案系統中後,即可使用集算報表進行資料查詢和計算,集算報表內建的集算引擎可以基於檔案(和資料庫)進行資料計算。使用時,可以參考如下步驟(舉例說明):
1、將資料庫中曆史資料匯出到檔案
使用者可以自行選擇適當的方法將曆史資料匯出到檔案,當然這個過程也可以使用集算器來做,可以將資料匯出到文本,如果希望更高的效能,集算報表還可以支援更高效的二進位檔案格式(比文本能快出2-5倍)。在集算器(用免費版本即可)中執行類似如下代碼可將文字檔轉換成二進位格式:
file("E:/訂單明細.b").export@b(file(“E:/訂單明細.txt”.cursor())
2、使用集算報表內建的集算引擎讀取資料檔案
當資料外置後,採用集算報表就如同使用檔案資料來源做報表了,比如根據訂單詳細資料按客戶統計訂單數量和訂單金額,由於原始訂單資料非常大,所以讀入檔案時採用流式(檔案遊標)的方式逐步讀入。
指令碼中使用的參數及其含義如下:
指令碼:
A1:通過檔案遊標採用串流的方式讀入大源文本資料;
A2:按照指定的多個維度進行資料過濾,結果仍然是遊標;
A3:根據選出的結果,按照客戶ID匯總訂單數量和訂單金額;
A4:為報表返回結果集。
如前面提到的,集算報表既可以針對單獨的檔案(曆史資料)進行查詢計算,還可以進行檔案+資料庫混合運算,進行大資料量即時查詢。
A1-A3:與上一個指令碼一樣,匯總曆史資料;
A5:根據指定參數執行sql,匯總當期資料;
A6:將兩部分摘要資料合并(縱向拼接);
A7:根據合并後的曆史和當期摘要資料再次匯總,得到各客戶的訂單數量和訂單金額。
3、在集算報表中調用集算指令碼,編輯報表運算式完成報表製作
通過以上的過程可以清晰的看到,集算報表可以很好解決針對往期曆史(+當期)資料進行查詢時往往存在效能不高的問題,通過資料外置提升報表效能。