從報(bào)表性能談集算器
關(guān)于報(bào)表性能問(wèn)題,自從有報(bào)表的那一天,報(bào)表的性能問(wèn)題其實(shí)就存在,只不過(guò)是否突出到影響用戶(hù)感受而已。所謂的報(bào)表性能,其實(shí)90%甚至更多的是數(shù)據(jù)計(jì)算的性能,報(bào)表的本職工作其實(shí)應(yīng)該僅僅是數(shù)據(jù)呈現(xiàn)而已,而因?yàn)閳?bào)表格式復(fù)雜或樣式精美而帶來(lái)的展現(xiàn)效率問(wèn)題其實(shí)是少之又少。
目前市面上大部分的報(bào)表廠商都集數(shù)據(jù)計(jì)算和數(shù)據(jù)呈現(xiàn)于一體,所以漸漸地,用戶(hù)就覺(jué)得報(bào)表就應(yīng)該有計(jì)算能力并且計(jì)算能力還應(yīng)當(dāng)很出色,計(jì)算能力甚至是招標(biāo)指標(biāo)中的重要組成部分,所以一旦報(bào)表在計(jì)算過(guò)程中出現(xiàn)效率低,占用資源多等現(xiàn)象時(shí),隨之而來(lái)的就是這個(gè)報(bào)表工具不好的結(jié)論。出現(xiàn)這樣的局面有一定歷史原因,在電子報(bào)表剛剛興起的時(shí)候,國(guó)內(nèi)的信息化水平普遍不高,業(yè)務(wù)邏輯相對(duì)簡(jiǎn)單,數(shù)據(jù)量也沒(méi)有積累到一定的量,所以報(bào)表具有簡(jiǎn)單的計(jì)算能力即可滿(mǎn)足大多數(shù)用戶(hù)的需求。而信息化高速發(fā)展的今天,用當(dāng)初的報(bào)表計(jì)算標(biāo)準(zhǔn)去應(yīng)對(duì)越來(lái)越多的數(shù)據(jù)和日益復(fù)雜的業(yè)務(wù)需求顯然力不從心,這時(shí)候我們就需要讓報(bào)表回歸本質(zhì),做好它的本職工作,而報(bào)表所不擅長(zhǎng)的計(jì)算則由更專(zhuān)業(yè)的計(jì)算引擎完成才是最好的解決方案。
既然要用專(zhuān)業(yè)的計(jì)算引擎輔助計(jì)算,那么就要說(shuō)一下現(xiàn)在最常用的兩種解決方案:SQL和JAVA。先不說(shuō)不同程序員寫(xiě)出來(lái)的SQL語(yǔ)句和JAVA程序的執(zhí)行效率參差不齊,單就SQL實(shí)現(xiàn)復(fù)雜多步運(yùn)算的不便,各種存儲(chǔ)過(guò)程、中間表的高維護(hù)成本;JAVA語(yǔ)言實(shí)現(xiàn)數(shù)據(jù)集過(guò)濾冗長(zhǎng)的代碼量,不便的調(diào)試方式等,都是這兩個(gè)過(guò)時(shí)的解決方案的問(wèn)題。
潤(rùn)乾公司的集算器就是一款專(zhuān)業(yè)的可以替代SQL和JAVA的更優(yōu)的數(shù)據(jù)計(jì)算工具。那么先簡(jiǎn)單介紹一下集算器。集算器是一款面向應(yīng)用程序員和數(shù)據(jù)分析員的專(zhuān)注于(半)結(jié)構(gòu)化數(shù)據(jù)分析與處理的程序設(shè)計(jì)語(yǔ)言。它的用法比JAVA更簡(jiǎn)單,比SQL更靈活比perl/python,R語(yǔ)言開(kāi)發(fā)效率更高。集算器的目標(biāo)是主要試圖解決的描述計(jì)算的效率和實(shí)施計(jì)算的效率這兩個(gè)問(wèn)題。所謂描述計(jì)算就是將自然思維過(guò)程告訴計(jì)算機(jī)并翻譯成計(jì)算機(jī)可以理解和執(zhí)行的精細(xì)化形式語(yǔ)言。而實(shí)施計(jì)算性能則是通過(guò)合適的算法,讓CPU少執(zhí)行一些基本運(yùn)算,硬盤(pán)少讀取一些數(shù)據(jù),從而達(dá)到提高性能的目的。下圖即是集算器在應(yīng)用中的定位。
潤(rùn)乾公司的集算器在很多應(yīng)用場(chǎng)景下對(duì)報(bào)表性能的提高有著不可思議的成績(jī)。例如:
在某金融機(jī)構(gòu)的業(yè)務(wù)報(bào)表中,原本在報(bào)表中用四個(gè)復(fù)雜SQL取數(shù),在報(bào)表中進(jìn)行復(fù)雜運(yùn)算和大數(shù)據(jù)量的關(guān)聯(lián),報(bào)表運(yùn)行時(shí)間為3700秒。而使用了潤(rùn)乾集算器,在不改變?nèi)魏斡布渲们闆r下,使用并行計(jì)算以及更改關(guān)聯(lián)算法,該報(bào)表運(yùn)行時(shí)間縮短到了105秒,性能提升了35倍之多。
在某銀行項(xiàng)目報(bào)表優(yōu)化案例中,某表使用了5個(gè)sql類(lèi)型數(shù)據(jù)源并進(jìn)行相關(guān)關(guān)聯(lián)運(yùn)算,運(yùn)行效率為90秒,而經(jīng)過(guò)集算器優(yōu)化計(jì)算過(guò)程后,報(bào)表的運(yùn)算效率縮短到4秒,性能提高了22.5倍,效果非常明顯。
在某省財(cái)政廳報(bào)表系統(tǒng)中,在執(zhí)行1.5萬(wàn)行*46列的某明細(xì)報(bào)表時(shí),在未進(jìn)行優(yōu)化前的展現(xiàn)速度為400秒,而采用了集算器的大數(shù)據(jù)集+二進(jìn)制流文件+游標(biāo)技術(shù)后,報(bào)表首次訪問(wèn)縮短到30秒,在啟用緩存后,第二次及緩存未失效時(shí),展現(xiàn)為10秒,性能提高了13倍之多。
像這樣證明潤(rùn)乾集算器可以提高報(bào)表性能例子不勝枚舉。這些強(qiáng)有力的案例都能證明,集算器確實(shí)是報(bào)表的加速器。更為可貴的是,潤(rùn)乾的集算器不僅僅可以為潤(rùn)乾報(bào)表加速,提供性能優(yōu)化,它的集成性非常好,提供標(biāo)準(zhǔn)的JDBC接口供外部應(yīng)用調(diào)用,即它可以服務(wù)于任何一個(gè)前端展示工具。
集算器除了可以提升報(bào)表運(yùn)算性能外,它的價(jià)值還體現(xiàn)在它可以?xún)?yōu)化報(bào)表的應(yīng)用結(jié)構(gòu)。剛才說(shuō)過(guò),通常我們會(huì)用JAVA程序做數(shù)據(jù)計(jì)算準(zhǔn)備,這樣就要求我們的JAVA程序必須和主程序一起打包編譯,這樣做會(huì)造成應(yīng)用耦合度高,并且在數(shù)據(jù)準(zhǔn)備算法有修改后,整個(gè)應(yīng)用要再次編譯并重新啟動(dòng),不能做到熱切換,而集算器支持模塊化管理,集算器的計(jì)算腳本可以和報(bào)表模板一起管理維護(hù),并且支持集算腳本的熱切換。而用SQL做數(shù)據(jù)計(jì)算過(guò)程中,存儲(chǔ)過(guò)程和中間表是不可避免的,這樣長(zhǎng)此以往會(huì)造成數(shù)據(jù)庫(kù)壓力大,集算器可以將數(shù)據(jù)外置后,給數(shù)據(jù)庫(kù)減負(fù)。同時(shí),集算器還支持使用多樣性數(shù)據(jù)源,做到揚(yáng)長(zhǎng)避短,充分利用各數(shù)據(jù)源優(yōu)勢(shì),例如利用非關(guān)系型數(shù)據(jù)庫(kù)的高IO吞吐,分布式文件系統(tǒng)的容錯(cuò)機(jī)制以及關(guān)系型數(shù)據(jù)庫(kù)的結(jié)構(gòu)化計(jì)算能力等。
總之,現(xiàn)在再遇到報(bào)表性能問(wèn)題,我們就要辯證的看問(wèn)題,報(bào)表的問(wèn)題就去優(yōu)化報(bào)表,計(jì)算的問(wèn)題就去優(yōu)化計(jì)算。哪疼醫(yī)哪才是解決問(wèn)題的王道。