輕量級高性能多維分析套件

什麼是輕量級?拋開技術術語,從效果上看就是爲了實現操作目的,使用更輕便、更省時的方法;那麼什麼是高性能呢?最直接的說法就是比常用方法更加高效、更快。

下面就來介紹潤乾提供的這一套輕量級、高性能的多維分析套件。

 

輕量級的準確含義,是相對於重量級框架而言的一種程序設計模式。輕量級的優點在於對容器沒有依賴性,易於配置,更加通用,啓動時間較短,並能充分減少開發複雜度;而高性能,則是指相比於常用方法而言,獲取期望結果更加快速、準確的實現方法。具體到潤乾報表,這裏將給大家介紹通過多維分析頁面對簡單SQL進行查詢。

這個過程其實很簡單:我們在多維分析頁面輸入簡單 SQL語句,通過集算器 JDBC 提交,然後對組表執行 SQL 查詢,將結果返回給多維分析前端。結構圖如下:

undefined 

其中,組表文件由集算器從各種異構數據源採集數據並計算而來,具體做法可以參考《集算器教程 - 組表》。

 

由於組表文件具備獨立計算的能力,可以脫離數據庫爲前端提供數據源服務,因此非常適合作爲中間件,並以此爲基礎實現這套olap套件。下面我們就使用集算器做一個測試,進一步瞭解和使用組表文件,並與oracle做對比,更加直觀的瞭解這個套件的輕量級、高性能特點。

測試環境

處理器Inter(R) Core(TM) i5-6200U CPU @ 2.30GHz 2.40GHz
內存8G
硬盤1TB
操作系統Windows10 家庭中文版(64 位)

測試使用的設備不算高端,但因爲測試的目的是對組表以及oracle進行對比,因此在相同環境下的數據之間作對比,設備影響因素不大,性能對比仍然是有效的參考。

設置授權

我們使用集算器對數據進行查詢比對,爲此我們需要在官網或乾學院中下載含高性能存儲的集算器試用授權到本地,然後在【工具-選項-環境】中選擇授權文件,設置後的結果如下:

undefined 

 

生成測試數據

爲了充分體現測試效果,測試用例的數據必須足夠大。我們將創建一個5000萬條數據、至少十個字段的數據表。

首先,在集算器中生成測試數據的txt格式文件:


AB
1=create(ID,產品編號,顏色,內存,擴展容量,核心數,主屏尺寸,電池容量,後置攝像頭,前置攝像頭,機身重量,質保時間,雙卡雙待,上市時間,單價,庫存量)
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]
62018-01-01=workdays(A6,A6+364)
7for 500=100000.new((A7-1)*100000+#:ID,rands("abcdefghijklmnopqrstuvwxyz0123456789",36): 產品編號,A2(B2.pseg(rand())): 顏色,A3(B2.pseg(rand())): 內存,A4(B2.pseg(rand())): 擴展容量,A5(B5.pseg(rand())): 核心數,(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))+"萬 / 像素"): 後置攝像頭,(string(int(round((rand()*(2-1)+1),1)*1000))+"萬 / 像素"): 前置攝像頭,(string(int(round((rand()*(2-1)+1),2)*100))+"克"): 機身重量,(string(int(rand()*3+1))+"年"): 質保時間,if(rand()<0.5,"支持","不支持"): 雙卡雙待,string(elapse(A6,-rand(100))): 上市時間,int(rand()*(4999-1999)): 單價,int(rand()*(999-9)): 庫存量 )
8
>file("D:\\test.txt").export@ta(B7)

生成的txt文件大小爲6284M。

undefined 

然後我們要將這個txt中的手機產品表數據,用 SPL 語言腳本轉儲到集算器組表文件 test.ctx 中。SPL 腳本如下:


A
1=file("D:\\test.ctx")
2=A1.create(ID,產品編號,顏色,內存,擴展容量,核心數,主屏尺寸,電池容量,後置攝像頭,前置攝像頭,機身重量,質保時間,雙卡雙待,上市時間,單價,庫存量)
3=file("D:\\test.txt").cursor@t()
4=A2.append(A3)

test.ctx 是組表文件,默認採用列式存儲的,支持任意分段的並行計算,從而可以有效提升查詢速度。要注意在生成組表時,數據需要預先排序併合理定義維字段。

組表文件的大小大約爲3312M,而將txt中的數據轉儲到組表中所需的時間爲968s。

undefined 

與之對應,我們使用sqlloader將txt中的數據導入到oracle中,所需時間爲18小時左右,並且相同字段及數據量的oracle表所佔空間爲6683M。

undefined 

可以看出,將txt數據分別導入組表文件和oracle表中的時間真的是相差很大,而且,將數據導入oracle後所佔空間的大小與txt文件的大小所差無幾,相比之下,組表文件所佔空間只有一半,這得益於組表文件的壓縮效果。後面我們還會進一步討論分析與高性能相關的特性。

查詢數據

下面我們來對比一下用SQL查詢oracle表以及組表文件所需的時間,直接用效果說話:

查詢指定字段:

查詢組表:select ID,產品編號,庫存量 from test.ctx limit 5000

查詢oracle:select ID,產品編號,庫存量 from myTestTable where rownum <= 5000

查詢ID、產品編號以及庫存量:查詢組表用時1s;查詢oracle表用時33s;

添加where查詢條件:

查詢組表:select ID,產品編號,庫存量 from test.ctx where 顏色=’土豪金’ limit 5000

查詢oracle:select ID,產品編號,庫存量 from myTestTable where 顏色=’土豪金’ and rownum <= 5000

查詢表中產品顏色爲土豪金的數據:查詢組表用時1s;查詢oracle表用時58s;

select ID,產品編號,單價,庫存量 from myTestTable/test.ctx where 顏色=’黑’ and 庫存量 > 500 and 單價 > 2000

查詢顏色爲黑且庫存量大於500、單價大於2000的數據:查詢組表用時92s;查詢oracle表用時2353s;

此時我們還可以嘗試並行查詢:

select /*+ parallel(4) */ID,產品編號,單價,庫存量 from myTestTable/test.ctx where 顏色=’黑’ and 庫存量 > 500 and 單價 > 2000

查詢組表用時84s;查詢oracle表用時2105s;

 

執行以上查詢語句後我們可以發現,查詢組表的速度要比直接查詢oracle錶快很多。當然,多維分析中很少用到明細查詢,對明細查詢的性能要求也不高,我們更關注彙總統計的性能,也就是有GROUP BY的情況,下面來試一下。:

查詢組表/oracle:select 顏色,max(庫存量) from test.ctx/myTestTable group by 顏色

查詢產品每個顏色的最大庫存量:查詢組表用時12s;查詢oracle表用時297s;

查詢組表/oracle:select 顏色,內存,max(庫存量) from test.ctx/myTestTable group by 顏色,內存

查詢產品每個顏色中,各內存的最大庫存量:查詢組表用時17s;查詢oracle表用時334s;

查詢組表/oracle:select /*+ parallel(4) */顏色,內存,max(庫存量) from test.ctx/myTestTable group by 顏色,內存

嘗試並行查詢產品每個顏色中,各內存的最大庫存量:查詢組表用時13s;查詢oracle表用時308s;

查詢組表:select 內存,sum(庫存量) from test.ctx where 上市時間 between date('2018-01-01') and date('2018-12-31')  group by 內存

查詢oracle:select 內存,sum(庫存量) from myTestTable where 上市時間 between to_date('2018-01-01',’yyyy-mm-dd’) and to_date('2018-12-31',’yyyy-mm-dd’)  group by 內存

查詢2018年上市的產品中各種內存的總庫存量:查詢組表用時5s;查詢oracle表用時10s;

查詢組表:select 內存,min(機身重量),avg(單價) from test.ctx where 上市時間 between date('2018-01-01') and date('2018-12-31')  group by 內存

查詢oracle:select 內存,min(機身重量),avg(單價) from myTestTable where 上市時間 between to_date('2018-01-01',’yyyy-mm-dd’) and to_date('2018-12-31',’yyyy-mm-dd’)  group by 內存

查詢2018年上市產品的最小機身重量和平均單價:查詢組表用時6s;查詢oracle表用時11s;

查詢組表:select 內存,min(機身重量),avg(單價) from test.ctx where 上市時間 between date('2018-01-01') and date('2018-12-31') group by 內存 having avg(單價)>=1500

查詢oracle:select 內存,min(機身重量),avg(單價) from myTestTable where 上市時間 between to_date('2018-01-01',’yyyy-mm-dd’) and to_date('2018-12-31',’yyyy-mm-dd’)  group by 內存 having avg(單價)>=1500

查詢2018年上市產品中,單價不小於1500的最小機身重量和平均單價:查詢組表用時14s;查詢oracle表用時38s;

毫無懸念,對於彙總統計,查詢組表的速度也要顯著快於查詢oracle。

 

根據上面對大數據量的組表以及數據庫的查詢速度比較,可以發現查詢條件越少,兩者之間的效率對比也就越明顯,查詢組表數據始終快於查詢數據庫,這就清晰地體現除了組表高性能的特點。由此我們推斷,在多維分析頁面下,對組表進行查詢要比對數據庫進行查詢更加高效。

下面我們就將組表與分析界面結合起來進行查詢。

與分析界面結合

(1)在報表中添加集算器JDBC並連接數據源:

undefined 

 

(2)集算器raqsoftConfig.xml複製到報表WEB-INF的類路徑下:

將[集算器目錄]\esProc\config下的raqsoftConfig.xml複製到[報表目錄]\report\web\webapps\demo\WEB-INF\classes中;

 

(3)將組表文件放到集算器尋址路徑路徑下:

本例中,我們將使用組表文件test.ctx。

undefined 

undefined 

 

(4)修改多維分析頁面

打開[報表目錄]\report\web\webapps\demo\raqsoft\guide\jsp\olap.jsp,將jsp中的DataSource修改爲(1)中設置的數據源名稱“esproc”;依舊使用上述的示例,sql語句這裏我們用“select 內存,avg(單價) as 單價平均值 from test.ctx where 上市時間 between date('2018-01-01') and date('2018-12-31')  group by 內存”;

undefined 

undefined 

 

(5)訪問頁面

我們通過雙擊[報表目錄]\report\bin下的startdemo.bat啓動服務器,或者在報表IDE中點擊undefined啓動Tomcat服務器。

在瀏覽器地址欄輸入“http://localhost:6868/demo/raqsoft/guide/jsp/olap.jsp?sqlId=sqlId1”對頁面進行訪問,這時頁面中就可以展現從集算器JDBC中所返回的數據,並且可以在頁面中進行拖拽等操作。

undefined 

當然,這裏還是要對比一下查詢組表文件與查詢oracle的時間:查詢組表文件用時7s,查詢oracle用時22s,組表明顯更勝一籌。

 

 

將組表與多維分析界面進行結合,從組表而不是從數據庫中取數,用戶可以更方便的製作數據量大的報表,大大縮短了等待數據顯示的時間;對比昂貴的專業數據庫和相對封閉的 BI 自帶數據源,集算器可以提供更加經濟、簡便的解決方案,並能夠從各種異構數據源採集數據生成組表文件以供使用。同時整個配置過程非常簡單,這些都體現了這個套件的輕量級、高性能的特點。

和普通數據庫方案相比,集算器列存的二進制文件,也就是組表文件,能夠直接提升性能。在生成組表時,指定了維字段,數據本身將按照維字段有序存放,這樣,常用的條件過濾計算不依賴索引也能保證高性能。另外,更加輕量的一點是,組表文件採用壓縮存儲,顯著減少了所佔用的硬盤空間,讀取也就更快了。


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