重慶分公司,新征程啟航
為企業(yè)提供網(wǎng)站建設(shè)、域名注冊(cè)、服務(wù)器等服務(wù)
為企業(yè)提供網(wǎng)站建設(shè)、域名注冊(cè)、服務(wù)器等服務(wù)
什么是輕量級(jí)?拋開技術(shù)術(shù)語(yǔ),從效果上看就是為了實(shí)現(xiàn)操作目的,使用更輕便、更省時(shí)的方法;那么什么是高性能呢?最直接的說(shuō)法就是比常用方法更加高效、更快。
創(chuàng)新互聯(lián)公司憑借專業(yè)的設(shè)計(jì)團(tuán)隊(duì)扎實(shí)的技術(shù)支持、優(yōu)質(zhì)高效的服務(wù)意識(shí)和豐厚的資源優(yōu)勢(shì),提供專業(yè)的網(wǎng)站策劃、網(wǎng)站制作、網(wǎng)站設(shè)計(jì)、網(wǎng)站優(yōu)化、軟件開發(fā)、網(wǎng)站改版等服務(wù),在成都十多年的網(wǎng)站建設(shè)設(shè)計(jì)經(jīng)驗(yàn),為成都上千家中小型企業(yè)策劃設(shè)計(jì)了網(wǎng)站。
下面就來(lái)介紹潤(rùn)乾提供的這一套輕量級(jí)、高性能的多維分析套件。
?
輕量級(jí)的準(zhǔn)確含義,是相對(duì)于重量級(jí)框架而言的一種程序設(shè)計(jì)模式。輕量級(jí)的優(yōu)點(diǎn)在于對(duì)容器沒有依賴性,易于配置,更加通用,啟動(dòng)時(shí)間較短,并能充分減少開發(fā)復(fù)雜度;而高性能,則是指相比于常用方法而言,獲取期望結(jié)果更加快速、準(zhǔn)確的實(shí)現(xiàn)方法。具體到潤(rùn)乾報(bào)表,這里將給大家介紹通過(guò)多維分析頁(yè)面對(duì)簡(jiǎn)單SQL進(jìn)行查詢。
這個(gè)過(guò)程其實(shí)很簡(jiǎn)單:我們?cè)诙嗑S分析頁(yè)面輸入簡(jiǎn)單 SQL語(yǔ)句,通過(guò)集算器 JDBC 提交,然后對(duì)組表執(zhí)行 SQL 查詢,將結(jié)果返回給多維分析前端。結(jié)構(gòu)圖如下:
?
其中,組表文件由集算器從各種異構(gòu)數(shù)據(jù)源采集數(shù)據(jù)并計(jì)算而來(lái),具體做法可以參考《集算器教程 - 組表》。
?
由于組表文件具備獨(dú)立計(jì)算的能力,可以脫離數(shù)據(jù)庫(kù)為前端提供數(shù)據(jù)源服務(wù),因此非常適合作為中間件,并以此為基礎(chǔ)實(shí)現(xiàn)這套o(hù)lap套件。下面我們就使用集算器做一個(gè)測(cè)試,進(jìn)一步了解和使用組表文件,并與oracle做對(duì)比,更加直觀的了解這個(gè)套件的輕量級(jí)、高性能特點(diǎn)。
處理器 | Inter(R) Core(TM) i5-6200U CPU @ 2.30GHz 2.40GHz |
內(nèi)存 | 8G |
硬盤 | 1TB |
操作系統(tǒng) | Windows10 家庭中文版(64 位) |
測(cè)試使用的設(shè)備不算高端,但因?yàn)闇y(cè)試的目的是對(duì)組表以及oracle進(jìn)行對(duì)比,因此在相同環(huán)境下的數(shù)據(jù)之間作對(duì)比,設(shè)備影響因素不大,性能對(duì)比仍然是有效的參考。
我們使用集算器對(duì)數(shù)據(jù)進(jìn)行查詢比對(duì),為此我們需要在官網(wǎng)或乾學(xué)院中下載含高性能存儲(chǔ)的集算器試用授權(quán)到本地,然后在【工具-選項(xiàng)-環(huán)境】中選擇授權(quán)文件,設(shè)置后的結(jié)果如下:
?
?
為了充分體現(xiàn)測(cè)試效果,測(cè)試用例的數(shù)據(jù)必須足夠大。我們將創(chuàng)建一個(gè)5000萬(wàn)條數(shù)據(jù)、至少十個(gè)字段的數(shù)據(jù)表。
首先,在集算器中生成測(cè)試數(shù)據(jù)的txt格式文件:
A | B | |
1 | =create(ID,產(chǎn)品編號(hào),顏色,內(nèi)存,擴(kuò)展容量,核心數(shù),主屏尺寸,電池容量,后置攝像頭,前置攝像頭,機(jī)身重量,質(zhì)保時(shí)間,雙卡雙待,上市時(shí)間,單價(jià),庫(kù)存量) | |
2 | [黑,白,銀,玫瑰金,土豪金] | [0,0.5,0.75,0.9,0.95,1] |
3 | [32,128,64,16,8] | |
4 | [64,16,8,128,32] | |
5 | [2,8,4] | [0,0.5,0.9,1] |
6 | 2018-01-01 | =workdays(A6,A6+364) |
7 | for 500 | =100000.new((A7-1)*100000+#:ID,rands("abcdefghijklmnopqrstuvwxyz0123456789",36): 產(chǎn)品編號(hào),A2(B2.pseg(rand())): 顏色,A3(B2.pseg(rand())): 內(nèi)存,A4(B2.pseg(rand())): 擴(kuò)展容量,A5(B5.pseg(rand())): 核心數(shù),(string(round((rand()*(6-5)+5),1))+"寸"): 主屏尺寸,(string(int(round((rand()*(4-3)+3),1)*1000))+"mAh"): 電池容量,(string(int(round((rand()*(3-2)+2),1)*1000))+"萬(wàn) / 像素"): 后置攝像頭,(string(int(round((rand()*(2-1)+1),1)*1000))+"萬(wàn) / 像素"): 前置攝像頭,(string(int(round((rand()*(2-1)+1),2)*100))+"克"): 機(jī)身重量,(string(int(rand()*3+1))+"年"): 質(zhì)保時(shí)間,if(rand()<0.5,"支持","不支持"): 雙卡雙待,string(elapse(A6,-rand(100))): 上市時(shí)間,int(rand()*(4999-1999)): 單價(jià),int(rand()*(999-9)): 庫(kù)存量 ) |
8 | >file("D:\\test.txt").export@ta(B7) |
生成的txt文件大小為6284M。
?
然后我們要將這個(gè)txt中的手機(jī)產(chǎn)品表數(shù)據(jù),用 SPL 語(yǔ)言腳本轉(zhuǎn)儲(chǔ)到集算器組表文件 test.ctx 中。SPL 腳本如下:
A | |
1 | =file("D:\\test.ctx") |
2 | =A1.create(ID,產(chǎn)品編號(hào),顏色,內(nèi)存,擴(kuò)展容量,核心數(shù),主屏尺寸,電池容量,后置攝像頭,前置攝像頭,機(jī)身重量,質(zhì)保時(shí)間,雙卡雙待,上市時(shí)間,單價(jià),庫(kù)存量) |
3 | =file("D:\\test.txt").cursor@t() |
4 | =A2.append(A3) |
test.ctx 是組表文件,默認(rèn)采用列式存儲(chǔ)的,支持任意分段的并行計(jì)算,從而可以有效提升查詢速度。要注意在生成組表時(shí),數(shù)據(jù)需要預(yù)先排序并合理定義維字段。
組表文件的大小大約為3312M,而將txt中的數(shù)據(jù)轉(zhuǎn)儲(chǔ)到組表中所需的時(shí)間為968s。
?
與之對(duì)應(yīng),我們使用sqlloader將txt中的數(shù)據(jù)導(dǎo)入到oracle中,所需時(shí)間為18小時(shí)左右,并且相同字段及數(shù)據(jù)量的oracle表所占空間為6683M。
?
可以看出,將txt數(shù)據(jù)分別導(dǎo)入組表文件和oracle表中的時(shí)間真的是相差很大,而且,將數(shù)據(jù)導(dǎo)入oracle后所占空間的大小與txt文件的大小所差無(wú)幾,相比之下,組表文件所占空間只有一半,這得益于組表文件的壓縮效果。后面我們還會(huì)進(jìn)一步討論分析與高性能相關(guān)的特性。
下面我們來(lái)對(duì)比一下用SQL查詢oracle表以及組表文件所需的時(shí)間,直接用效果說(shuō)話:
查詢指定字段:
查詢組表:select ID,產(chǎn)品編號(hào),庫(kù)存量 from test.ctx limit 5000 查詢oracle:select ID,產(chǎn)品編號(hào),庫(kù)存量 from myTestTable where rownum <= 5000 |
查詢ID、產(chǎn)品編號(hào)以及庫(kù)存量:查詢組表用時(shí)1s;查詢oracle表用時(shí)33s;
添加where查詢條件:
查詢組表:select ID,產(chǎn)品編號(hào),庫(kù)存量 from test.ctx where 顏色=’土豪金’?limit 5000 查詢oracle:select ID,產(chǎn)品編號(hào),庫(kù)存量 from myTestTable where 顏色=’土豪金’?and rownum <= 5000 |
查詢表中產(chǎn)品顏色為土豪金的數(shù)據(jù):查詢組表用時(shí)1s;查詢oracle表用時(shí)58s;
select ID,產(chǎn)品編號(hào),單價(jià),庫(kù)存量 from myTestTable/test.ctx where 顏色=’黑’?and 庫(kù)存量 > 500 and 單價(jià) > 2000 |
查詢顏色為黑且?guī)齑媪看笥?00、單價(jià)大于2000的數(shù)據(jù):查詢組表用時(shí)92s;查詢oracle表用時(shí)2353s;
此時(shí)我們還可以嘗試并行查詢:
select /*+ parallel(4) */ID,產(chǎn)品編號(hào),單價(jià),庫(kù)存量 from myTestTable/test.ctx where 顏色=’黑’?and 庫(kù)存量 > 500 and 單價(jià) > 2000 |
查詢組表用時(shí)84s;查詢oracle表用時(shí)2105s;
?
執(zhí)行以上查詢語(yǔ)句后我們可以發(fā)現(xiàn),查詢組表的速度要比直接查詢oracle表快很多。當(dāng)然,多維分析中很少用到明細(xì)查詢,對(duì)明細(xì)查詢的性能要求也不高,我們更關(guān)注匯總統(tǒng)計(jì)的性能,也就是有GROUP BY的情況,下面來(lái)試一下。:
查詢組表/oracle:select 顏色,max(庫(kù)存量) from test.ctx/myTestTable group by 顏色 |
查詢產(chǎn)品每個(gè)顏色的最大庫(kù)存量:查詢組表用時(shí)12s;查詢oracle表用時(shí)297s;
查詢組表/oracle:select 顏色,內(nèi)存,max(庫(kù)存量) from test.ctx/myTestTable group by 顏色,內(nèi)存 |
查詢產(chǎn)品每個(gè)顏色中,各內(nèi)存的最大庫(kù)存量:查詢組表用時(shí)17s;查詢oracle表用時(shí)334s;
查詢組表/oracle:select /*+ parallel(4) */顏色,內(nèi)存,max(庫(kù)存量) from test.ctx/myTestTable group by 顏色,內(nèi)存 |
嘗試并行查詢產(chǎn)品每個(gè)顏色中,各內(nèi)存的最大庫(kù)存量:查詢組表用時(shí)13s;查詢oracle表用時(shí)308s;
查詢組表:select 內(nèi)存,sum(庫(kù)存量) from test.ctx where 上市時(shí)間 between date('2018-01-01') and date('2018-12-31') ?group by 內(nèi)存 查詢oracle:select 內(nèi)存,sum(庫(kù)存量) from myTestTable where 上市時(shí)間 between to_date('2018-01-01',’yyyy-mm-dd’) and to_date('2018-12-31',’yyyy-mm-dd’) ?group by 內(nèi)存 |
查詢2018年上市的產(chǎn)品中各種內(nèi)存的總庫(kù)存量:查詢組表用時(shí)5s;查詢oracle表用時(shí)10s;
查詢組表:select 內(nèi)存,min(機(jī)身重量),avg(單價(jià)) from test.ctx where 上市時(shí)間 between date('2018-01-01') and date('2018-12-31') ?group by 內(nèi)存 查詢oracle:select 內(nèi)存,min(機(jī)身重量),avg(單價(jià)) from myTestTable where 上市時(shí)間 between to_date('2018-01-01',’yyyy-mm-dd’) and to_date('2018-12-31',’yyyy-mm-dd’) ?group by 內(nèi)存 |
查詢2018年上市產(chǎn)品的最小機(jī)身重量和平均單價(jià):查詢組表用時(shí)6s;查詢oracle表用時(shí)11s;
查詢組表:select 內(nèi)存,min(機(jī)身重量),avg(單價(jià)) from test.ctx where 上市時(shí)間 between date('2018-01-01') and date('2018-12-31') group by 內(nèi)存 having avg(單價(jià))>=1500 查詢oracle:select 內(nèi)存,min(機(jī)身重量),avg(單價(jià)) from myTestTable where 上市時(shí)間 between to_date('2018-01-01',’yyyy-mm-dd’) and to_date('2018-12-31',’yyyy-mm-dd’) ?group by 內(nèi)存 having avg(單價(jià))>=1500 |
查詢2018年上市產(chǎn)品中,單價(jià)不小于1500的最小機(jī)身重量和平均單價(jià):查詢組表用時(shí)14s;查詢oracle表用時(shí)38s;
毫無(wú)懸念,對(duì)于匯總統(tǒng)計(jì),查詢組表的速度也要顯著快于查詢oracle。
?
根據(jù)上面對(duì)大數(shù)據(jù)量的組表以及數(shù)據(jù)庫(kù)的查詢速度比較,可以發(fā)現(xiàn)查詢條件越少,兩者之間的效率對(duì)比也就越明顯,查詢組表數(shù)據(jù)始終快于查詢數(shù)據(jù)庫(kù),這就清晰地體現(xiàn)除了組表高性能的特點(diǎn)。由此我們推斷,在多維分析頁(yè)面下,對(duì)組表進(jìn)行查詢要比對(duì)數(shù)據(jù)庫(kù)進(jìn)行查詢更加高效。
下面我們就將組表與分析界面結(jié)合起來(lái)進(jìn)行查詢。
(1)在報(bào)表中添加集算器JDBC并連接數(shù)據(jù)源:
?
?
(2)集算器raqsoftConfig.xml復(fù)制到報(bào)表WEB-INF的類路徑下:
將[集算器目錄]\esProc\config下的raqsoftConfig.xml復(fù)制到[報(bào)表目錄]\report\web\webapps\demo\WEB-INF\classes中;
?
(3)將組表文件放到集算器尋址路徑路徑下:
本例中,我們將使用組表文件test.ctx。
?
?
?
(4)修改多維分析頁(yè)面
打開[報(bào)表目錄]\report\web\webapps\demo\raqsoft\guide\jsp\olap.jsp,將jsp中的DataSource修改為(1)中設(shè)置的數(shù)據(jù)源名稱“esproc”;依舊使用上述的示例,sql語(yǔ)句這里我們用“select 內(nèi)存,avg(單價(jià)) as 單價(jià)平均值 from test.ctx where 上市時(shí)間 between date('2018-01-01') and date('2018-12-31') ?group by 內(nèi)存”;
?
?
?
(5)訪問頁(yè)面
我們通過(guò)雙擊[報(bào)表目錄]\report\bin下的startdemo.bat啟動(dòng)服務(wù)器,或者在報(bào)表IDE中點(diǎn)擊啟動(dòng)Tomcat服務(wù)器。
在瀏覽器地址欄輸入“http://localhost:6868/demo/raqsoft/guide/jsp/olap.jsp?sqlId=sqlId1”對(duì)頁(yè)面進(jìn)行訪問,這時(shí)頁(yè)面中就可以展現(xiàn)從集算器JDBC中所返回的數(shù)據(jù),并且可以在頁(yè)面中進(jìn)行拖拽等操作。
?
當(dāng)然,這里還是要對(duì)比一下查詢組表文件與查詢oracle的時(shí)間:查詢組表文件用時(shí)7s,查詢oracle用時(shí)22s,組表明顯更勝一籌。
?
?
將組表與多維分析界面進(jìn)行結(jié)合,從組表而不是從數(shù)據(jù)庫(kù)中取數(shù),用戶可以更方便的制作數(shù)據(jù)量大的報(bào)表,大大縮短了等待數(shù)據(jù)顯示的時(shí)間;對(duì)比昂貴的專業(yè)數(shù)據(jù)庫(kù)和相對(duì)封閉的 BI 自帶數(shù)據(jù)源,集算器可以提供更加經(jīng)濟(jì)、簡(jiǎn)便的解決方案,并能夠從各種異構(gòu)數(shù)據(jù)源采集數(shù)據(jù)生成組表文件以供使用。同時(shí)整個(gè)配置過(guò)程非常簡(jiǎn)單,這些都體現(xiàn)了這個(gè)套件的輕量級(jí)、高性能的特點(diǎn)。
和普通數(shù)據(jù)庫(kù)方案相比,集算器列存的二進(jìn)制文件,也就是組表文件,能夠直接提升性能。在生成組表時(shí),指定了維字段,數(shù)據(jù)本身將按照維字段有序存放,這樣,常用的條件過(guò)濾計(jì)算不依賴索引也能保證高性能。另外,更加輕量的一點(diǎn)是,組表文件采用壓縮存儲(chǔ),顯著減少了所占用的硬盤空間,讀取也就更快了。