報表在展現或匯出時往往需要從資料庫中取出大量資料,而 jdbc 的取數速度一向比較慢,有可能成為報表各運算環節的短板或瓶頸,從而嚴重影響整個報表的生成效率。針對這一問題,潤幹報表可以利用平行計算機制(需要結合集算器實現)來顯著提高 jdbc 的取數效能。
所謂並行取數是指,使用多執行緒技術在報表工具與資料庫之間建立多個連線,同時讀取乙份源資料。這種讀取方式需要將源資料分段,每個執行緒(資料庫連線)讀取其中一段內容,最後將所有執行緒的結果合併得到最終結果。這種看似複雜的方式對於潤幹報表來說,可以由內建的並行機制(需要結合集算器實現)很容易完成。下面就以 oracle 為例說明實現過程。
使用者狀態表展現的是明細資料,由於需要匯出,必須一次性讀取資料表中所有資料。單錶資料量為 360 萬,報表樣式為:
以下為實現步驟:
使用集算器編寫指令碼(parallel.dfx),實現並行取數邏輯。首先確定分段字段,這裡選擇數值型的 userid 字段,再據設定的執行緒數和 userid 最大值(定義為大數值常量)計算每段中 userid 的範圍;最後根據指定的資料範圍通過 sql 分段讀取資料,完成多執行緒取數過程。以下為實現指令碼:ab
12020000000l
userid 最大值不超過 2020m24
設定 4 執行緒
3=a1/a2
每執行緒處理的 userid 數量
4=a2.(a3*(~-1))
每執行緒處理的 userid 起始值
5fork a4
=connect(「wm」)
6=b5.query@x(「select * from t_dw_zx_account_status_day where userid>=? and userid」,a5,a5+a3)
7return a5.conj()
新建報表模板後,資料集選擇「集算器」,在資料集編輯視窗指定上述編輯好的 dfx 檔案,完成資料集建立。
設定報表模板表示式:
a2:根據資料集 ds1 使用 select 函式取使用者登入資訊列表
報表執行後記錄資料集計算時間,並行前和並行後的執行結果比較如下:
可以看到並行取數帶來的效果,通過潤幹報表的並行機制可以明顯加速取數過程,從而提公升整體報表效能。測試結果因測試環境而異,本例的配置詳見附錄。
使用多執行緒並行取數適合資料庫資源比較空閒(如連線數未達上限)的情況,能夠通過並行方式充分利用資料庫資源。如果資料庫任務已經飽和,這種方法反而會進一步加重資料庫負擔,不會起到提高速度的作用。
此外,分段欄位的選擇對效能影響較大。最好是選擇遞增插入的索引字段,如作為主鍵的流水號,這樣資料庫能充分利用索引減少遍歷範圍;同時分段時也應盡量選擇數值型別字段,作為條件的運算效能更高且易於拆分。實際操作中要綜合考慮這兩方面因素,本例中由於沒有索引和主鍵,所以選擇了數值型 userid。實際業務中經常能找到遞增插入的有索引的數值型字段,採用並行取數的方式獲得的效能提公升也會更好。
測試機型:dell inspiron 3420
cpu:intel core i5-3210m @2.50ghz *4
ram:4g
hdd:西數 wdc(500g 5400 轉 / 分)
作業系統:win7(x64) sp1
jdk:1.6
資料庫:oracle11g r2
潤幹報表版本:2018
如何提高報表的取數效能
報表在展現或匯出時往往需要從資料庫中取出大量資料,而 jdbc 的取數速度一向比較慢,有可能成為報表各運算環節的短板或瓶頸,從而嚴重影響整個報表的生成效率。針對這一問題,潤幹報表可以利用平行計算機制 需要結合集算器實現 來顯著提高 jdbc 的取數效能。所謂並行取數是指,使用多執行緒技術在報表工具與...
如何提高報表的取數效能
報表在展現或匯出時往往需要從資料庫中取出大量資料,而 jdbc 的取數速度一向比較慢,有可能成為報表各運算環節的短板或瓶頸,從而嚴重影響整個報表的生成效率。針對這一問題,潤幹報表可以利用平行計算機制 需要結合集算器實現 來顯著提高 jdbc 的取數效能。所謂並行取數是指,使用多執行緒技術在報表工具與...
如何提高MySQL效能
一 問題的提出 在應用系統開發初期,由於開發資料庫資料比較少,對於查詢sql語句,複雜檢視的的編寫等體會不出sql語句各種寫法的效能優劣,但是如果將應用系統 提交實際應用後,隨著資料庫中資料的增加,系統的響應速度就成為目前系統需要解決的最主要的問題之一。系統優化中乙個很重要的方面就是sql語句的優化...