我們有個帶 3 個數(shù)據(jù)集的報表跑了 2 分多鐘,太慢了,有啥辦法優(yōu)化嗎?

影響報表性能的因素有很多,數(shù)據(jù)量太大傳輸慢、SQL 復(fù)雜計(jì)算慢、數(shù)據(jù)集太多關(guān)聯(lián)慢等等。按照你的描述應(yīng)該問題應(yīng)該出在 3 個數(shù)據(jù)集在報表里關(guān)聯(lián)導(dǎo)致的報表太慢??梢詸z查一下在報表單元格里是否有類似:ds2.select(name,id==ds1.cusid) 這樣的表達(dá)式,表示數(shù)據(jù)集 2 和數(shù)據(jù)集 1 通過某個字段實(shí)現(xiàn)關(guān)聯(lián)。

幾乎所有報表工具在完成多數(shù)據(jù)集關(guān)聯(lián)時都采用順序遍歷的方式實(shí)現(xiàn),先拿一個數(shù)據(jù)集的第一條記錄去第二個數(shù)據(jù)集中遍歷查找符合條件的記錄,然后是第二條,第三條…,數(shù)據(jù)量大的時候性能就會很低。畫個圖看一下:

在報表里關(guān)聯(lián)這兩個數(shù)據(jù)集就要遍歷數(shù)據(jù)集 ds1 記錄數(shù)(100 萬)次數(shù)據(jù)集 ds2,總共比較 100 萬 *1000 次。。。速度當(dāng)然慢了。

要解決這個問題,得想辦法把關(guān)聯(lián)計(jì)算改到為報表準(zhǔn)備數(shù)據(jù)那個階段,方法有兩個。

一、用 SQL 完成原來 3 個數(shù)據(jù)集的關(guān)聯(lián)

寫個復(fù)雜 SQL,把原來 3 個數(shù)據(jù)集的 SQL 整合成一句,讓數(shù)據(jù)庫完成關(guān)聯(lián)計(jì)算(HASH JOIN),這樣會快很多。當(dāng)然這種做法有幾個限制:

1、 不能跨庫。如果原來的 3 個數(shù)據(jù)集來自不同數(shù)據(jù)庫,就不能這么干了。異構(gòu)源當(dāng)然也不行;

2、 不能有存儲過程。改造存儲過程的成本太高,而且需要相應(yīng)數(shù)據(jù)庫權(quán)限;

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

二、直接用帶強(qiáng)計(jì)算能力的報表工具

有一些報表工具帶腳本計(jì)算能力,這樣就可以事先關(guān)聯(lián)完多個數(shù)據(jù)集。這樣就改變了原來要么在數(shù)據(jù)庫里關(guān)聯(lián)(很多情況沒法實(shí)現(xiàn)),要么在報表模板里關(guān)聯(lián)(性能太低)的狀況,性能往往能提升幾倍到幾十倍。

這個文章介紹了詳細(xì)的實(shí)施過程:?如何提高多源關(guān)聯(lián)報表性能?,里面舉的三個例子性能分別提升了 5 倍、26 倍和 44 倍,效果比較明顯。

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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容