在報表應用中,針對歷史數據查詢的報表佔比很大,這類報表的特色是:第一,數據變化小,查詢的歷史數據幾乎不會發生變化;第二,數據量大,並且還會隨時間不斷增長。若是這些歷史數據始終存放在數據庫中,因爲大多數數據庫的 JDBC 性能都很低下(取數過程的數據對象轉換比從文件中讀取數據慢一個數量級),當涉及數據量較大或併發較多的時候,報表的性能會急劇降低。顯然,若是能將這些變化不大的歷史數據移出數據庫,採用文件系統存儲,就能夠得到比數據庫高得多的 IO 性能,從而提升報表的總體性能。sql
可是,報表並不能直接使用原始數據,都須要運算(好比查詢彙總)以後再進行呈現,而文件自己沒有計算能力,所以沒法提供報表須要的結果。此外,使用文件存儲的數據量通常都很大,僅靠報表呈現端很難實現高效的計算。數據庫
對於潤乾報表來講,這種需求徹底能夠在內置集算引擎的幫助下作到,稱爲庫外文件計算,或數據外置計算。所支持的文件類型包括:文本、Excel、JSON 格式文件等,還支持效率更高的二進制文件。併發
經過數據外置計算,將較大數據量的歷史數據從數據庫中剝離,除了能夠知足歷史查詢類報表的性能需求外,還能夠實現混合數據源(文件 + 數據庫)的計算,進而實現大數據量的實時數據查詢,好比從文件系統中讀取往期大量的歷史數據,從數據庫中讀取當期較小量的實時數據進行混合計算。由此,一方面能夠避免數據庫的 IO 瓶頸,快速提高報表性能,增大數據查詢範圍;另外一方面,將歷史數據移出,數據庫能夠專一於保證業務系統數據的一致性,而不是耗費資源在大量的歷史查詢任務上,這也是一種數據庫優化的手段。性能
下面用一個例子說明潤乾報表實現數據外置計算(結合集算器實現)的步驟:fetch
一、 將數據庫中歷史數據導出到文件大數據
用戶能夠自行選擇適當的方法將歷史數據導出到文件,固然這個過程也可使用集算器來作,好比將數據導出到文本。若是但願更高的性能,還可使用比文本能快 2-5 倍的二進制文件格式。在集算器中使用如下代碼可將文本文件轉換成二進制格式。優化
file("E:/訂單明細.b").export@b(file(「E:/訂單明細.txt」.cursor())
file("E:/訂單明細.b").export@b(file(「E:/訂單明細.txt」.cursor())
設計
二、 使用潤乾報表內置的集算引擎讀取數據文件code
當數據外置後,潤乾報表可將文件做爲數據源來設計報表,好比根據訂單明細按客戶統計訂單數量和訂單金額,因爲原始訂單數據很是大,因此讀入文件時採用流式(文件遊標)的方式逐步讀入。對象
腳本中使用的參數及其含義以下:
腳本:
A | |
---|---|
1 | =file(「E:/ 訂單明細.txt」).cursor@t() |
2 | =A1.select(貨主國家 ==county && 貨主地區 ==area && 貨主城市 ==city && 訂購日期 >=begin && 訂購日期 <=end) |
3 | =A2.groups(客戶 ID;count( 訂單 ID): 訂單數量,sum(訂單金額): 訂單總額 ) |
4 | return A3 |
代碼說明:
A1:經過文件遊標採用流式處理的方式讀入大文本;
A2:按照指定的多個維度進行數據過濾,結果仍然是遊標;
A3:根據選出的結果,按照客戶 ID 彙總訂單數量和訂單金額;
A4:爲報表返回結果集。
前面提到,潤乾報表既能夠針對單獨的文件(導出的歷史數據)進行查詢計算,還能夠進行文件 + 數據庫的混合運算,進行大數據量實時查詢。
A | |
---|---|
1 | =file(「E:/ 訂單明細.txt」).cursor@t() |
2 | =A1.select(訂購日期 >=begin && 訂購日期 <=end) |
3 | =A2.groups(客戶 ID;count( 訂單 ID): 訂單數量,sum(訂單金額): 訂單金額 ) |
4 | =connect(「cmos」) |
5 | =A4.cursor(「select 客戶 ID,count( 訂單 ID) 訂單數量,sum(訂單金額) 訂單金額 from 訂單明細 where 貨主國家 =? and 貨主地區 =? and 貨主城市 =? and 訂購日期 >? and 訂購日期 <? group by 客戶 ID」,county,area,city,begin,end) |
6 | =[A3,A5.fetch()].conj() |
7 | >A4.close() |
8 | =A6.groups(客戶 ID;sum( 訂單數量): 訂單總量,sum(訂單金額): 訂單總額 ) |
9 | return A7 |
代碼說明:
A1-A3:與上一個腳本同樣,彙總歷史數據;
A5:根據指定參數執行 sql,彙總當期數據;
A6:將兩部分彙總數據合併(縱向拼接);
A8:根據合併後的歷史和當期彙總數據再次彙總,獲得各客戶的訂單數量和訂單金額。
3 在潤乾報表中調用集算腳本,編輯報表表達式完成報表製做
數據集配置以下:
報表配置以下:
經過以上過程能夠清晰的看到,潤乾報表能夠經過數據外置提高報表性能,解決對往期歷史 + 當期數據進行查詢時性能不高的問題。