如何提高報表的取數效能

2021-09-16 18:13:05 字數 1883 閱讀 5667

報表在展現或匯出時往往需要從資料庫中取出大量資料,而 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語句的優化...