我們有個帶 3 個數據集的報表跑了 2 分多鐘,太慢了,有啥辦法優化嗎?

影響報表性能的因素有很多,數據量太大傳輸慢、SQL 複雜計算慢、數據集太多關聯慢等等。按照你的描述應該問題應該出在 3 個數據集在報表裏關聯導致的報表太慢。可以檢查一下在報表單元格里是否有類似:ds2.select(name,id==ds1.cusid) 這樣的表達式,表示數據集 2 和數據集 1 通過某個字段實現關聯。

幾乎所有報表工具在完成多數據集關聯時都採用順序遍歷的方式實現,先拿一個數據集的第一條記錄去第二個數據集中遍歷查找符合條件的記錄,然後是第二條,第三條…,數據量大的時候性能就會很低。畫個圖看一下:

png

在報表裏關聯這兩個數據集就要遍歷數據集 ds1 記錄數(100 萬)次數據集 ds2,總共比較 100 萬 *1000 次。。。速度當然慢了。

要解決這個問題,得想辦法把關聯計算改到爲報表準備數據那個階段,方法有兩個。

一、用 SQL 完成原來 3 個數據集的關聯

寫個複雜 SQL,把原來 3 個數據集的 SQL 整合成一句,讓數據庫完成關聯計算(HASH JOIN),這樣會快很多。當然這種做法有幾個限制:

1、 不能跨庫。如果原來的 3 個數據集來自不同數據庫,就不能這麼幹了。異構源當然也不行;

2、 不能有存儲過程。改造存儲過程的成本太高,而且需要相應數據庫權限;

3、 SQL 太複雜不好整合。有時報表的數據集 SQL 都很複雜,還帶有很多參數(報表傳過來的),很難整合到一起。其實這正是報表裏要用多數據集的原因,報表工具支持多數據集會帶來很多方便,但會影響性能。

二、直接用帶強計算能力的報表工具

有一些報表工具帶腳本計算能力,這樣就可以事先關聯完多個數據集。這樣就改變了原來要麼在數據庫裏關聯(很多情況沒法實現),要麼在報表模板裏關聯(性能太低)的狀況,性能往往能提升幾倍到幾十倍。

這個文章介紹了詳細的實施過程: 如何提高多源關聯報表性能 ,裏面舉的三個例子性能分別提升了 5 倍、26 倍和 44 倍,效果比較明顯。

而且,這個工具有了腳本能力還支持跨庫,文件、NoSQL 這些數據源,也能調用存儲過程,解決了數據庫面臨的那些問題。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章