多庫取數的效能最佳化方案

bubblegum發表於2019-12-17

當資料庫表資料量較大時,報表效能往往不高,此時僅針對 SQL 或報表端進行最佳化,效果往往不明顯。這種情況下要顯著提升效能,可以考慮採用並行多庫的方式,即採用一定規則(如時間)將資料分庫分段儲存,而報表同時訪問多個資料庫進行資料計算,最後在報表中進行彙總展現。

不過,一般報表工具並不具備這種並行取數彙總的能力,因此訪問多個資料庫讀取分段資料就需要藉助 Java 等高階語言完成,而使用 Java 編寫這樣的並行程式也並不簡單,更何況 Java 本身也缺乏對批次資料計算的基礎支援,不支援表示式引數和動態資料結構。凡此種種,使得一般報表工具難以直接使用並行多庫的方式提升效能。

本文介紹的潤乾報表內建了專門用於資料計算的集算引擎,所提供的平行計算能力允許使用者從多個資料庫中同時讀取資料並在報表端進行彙總展現,從而簡單快捷地提升報表效能。

    (注:並行多庫功能需要結合集算器實現。)

下面透過一個例子簡單說明並行多庫的使用方法(以 mysql 為例),更多實現細節可以參考潤乾報表的相關文件資料:

某電信企業為了提高報表效能,計劃將使用者服務使用資訊按照統計地區分庫儲存在 4 個 mysql 資料庫中,資訊統計報表根據指定時間段、品牌等條件過濾查詢後,彙總資料。使用潤乾報表進行並行分庫查詢的步驟如下:

1 使用集算器編寫並行指令碼,實現從多個資料庫取數後彙總結果。

並行指令碼:



A B
1 [mysql1,mysql2,mysql3,mysql4]
2 fork A1 =connect(A2)
3
=B2.query@x("select dac.product_no,dab.I0419,sum(V00000) V00000,sum(V00000_C) V00000_C,sum(V00100) V00100,sum(V00100_C) V00100_C from DM_AUTORPT_CALL_201302 dac,DM_AUTORPT_BASE_INFO_201302 dab where dac.product_no=dab.product_no and dac.op_time>=? and dac.op_time<=? and dab.I0419=? group by dac.product_no,dab.I0419",b_date,e_date,type)
4 =A2.conj()
5 =A4.groups(PRODUCT_NO;sum(V00000): 通話時長,sum(V00000_C): 通話次數,sum(V00100): 撥打本地時長,sum(V00100_C): 撥打本地次數 )

上述指令碼啟動了 4 個執行緒同時從 4 個資料庫取數計算,最後將結果歸併彙總。程式碼說明如下:

A1:指定了 4 個資料來源名稱,每個並行執行緒連線不同的資料庫

A2:使用多執行緒執行本網格中的程式碼塊,這裡啟動了 4 個子執行緒

B2:在每個執行緒中分別連線各自的資料來源

B3:向指定資料來源發出 SQL 執行進行資料庫內的彙總並取回結果。這時 4 個資料庫會同時分別執行各自的 SQL 語句,執行後自動關閉連線。

A4:合併子執行緒返回的結果

A5:再次彙總合併後的結果,該結果將返回給報表。

完成並行多庫運算有兩個關鍵點。一是能夠讓多個資料庫並行工作(第 2-3 行完成),這需要報表引擎提供簡易的並行程式編寫機制。二是能將平行計算的結果再次彙總(第 4,5 行完成),因為各分庫的結果可能有重複資料,這就需要報表引擎有較強的批次資料再計算能力。

2 在潤乾報表中呼叫上述集算指令碼作為資料集,編輯報表表示式完成報表製作

imagepng

小結:並行多庫適用於源資料量較大,但統計後資料量不大的情況。上面的例子針對每個資料庫建立一個連線取數,事實上採用並行程式還可以同時建立多個連線進行查詢,從而進一步提高報表查詢效率和整體效能。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69900830/viewspace-2667746/,如需轉載,請註明出處,否則將追究法律責任。

相關文章