小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

Oracle 和 MySQL 的 JDBC 到底有多慢?

 raqsoft 2019-10-23

經(jīng)常聽人說,數(shù)據(jù)庫的IO性能不佳,但說歸說,并沒有感性認(rèn)識。我們現(xiàn)在就來實際測試一下,常用的Oracle和MySQL的JDBC讀取性能如何。

之所以測試JDBC,是因為大部分應(yīng)用是JAVA寫的,也就只能用JDBC來訪問數(shù)據(jù)。這里僅測試用JDBC讀出數(shù)據(jù),并產(chǎn)生成Java的記錄對象(畢竟到了這一步才能在應(yīng)用中使用),不作任何計算。

1.        數(shù)據(jù)來源

使用TPCH生成的數(shù)據(jù),選用其中的customer表來做測試,數(shù)據(jù)記錄為3000萬行,8個字段。它生成的原始文本文件名為customer.tbl,文件大小為4.9G。利用數(shù)據(jù)庫提供的數(shù)據(jù)導(dǎo)入工具將此文件數(shù)據(jù)導(dǎo)入到Oracle和MySQL的數(shù)據(jù)表中。

2.        測試環(huán)境

在一臺Intel服務(wù)器上完成測試,2個Intel2670 CPU,主頻2.6G,共16核,內(nèi)存64G。數(shù)據(jù)庫表數(shù)據(jù)及文本文件均存儲在同一塊SSD硬盤上。

所有測試均在服務(wù)器本機上完成,沒有消耗網(wǎng)絡(luò)傳輸時間。

3.        數(shù)據(jù)庫讀數(shù)測試

通過Oracle提供的JDBC接口,用SQL語句執(zhí)行數(shù)據(jù)讀取。

Java寫起來麻煩,用SPL腳本執(zhí)行測試:


A
1 =now() /記錄時間
2 =connect("oracle") /連接數(shù)據(jù)
3 =A2.cursor("select * from customer") /生成取數(shù)游標(biāo)
4 for A3,10000 /循環(huán)取數(shù),每次10000條
5 =A2.close() /關(guān)閉連接
6 =interval@s(A1,now()) /計算時長

 

MySQL的測試代碼類似,不再贅述。

 

測試結(jié)果(時間單位:秒)


第一次 第二次 每秒行數(shù)
Oracle 293 281 106K
MySQL 518 381 79K

第二次可能由于操作系統(tǒng)有了硬盤緩存,所以更快。因為我們主要是為了測試JDBC的讀取時間,所以就以第二次為準(zhǔn),減少數(shù)據(jù)庫本身從硬盤讀數(shù)的影響。每秒讀出行數(shù)也是按第二次時間來計算的,也就是說,Oracle每秒能讀出10萬行多數(shù)據(jù),MySQL大概接近8萬行。當(dāng)然這個值和表的字段數(shù)及類型都有關(guān)(customer表有8個字段),只是一種參考。

 

4.        文本文件對比

只從上面的數(shù)據(jù)量還沒有太多感性認(rèn)識,我們再讀一下文本文件來對比。辦法是一樣的,從文件中讀出數(shù)據(jù),并解析出記錄,不作任何計算。

編寫如下SPL腳本執(zhí)行測試:


A
1 =now() /記錄時間
2 =file("/home/sjr/tbl/customer.tbl") /產(chǎn)生文件對象
3 =A2.cursor(;,"|") /生成取數(shù)游標(biāo),分隔符是|
4 for A3,10000 /循環(huán)取數(shù),每次10000條
5 =interval@s(A1,now()) /計算時長

測試結(jié)果是42秒!

這意味著,讀取文本要比讀取Oracle快281/42=6.69倍,比MySQL要快381/42=9.07倍!

我們知道,文本解析是個非常麻煩的事情,但即使這樣,從文本文件讀取數(shù)據(jù)還是遠(yuǎn)遠(yuǎn)快于從數(shù)據(jù)庫中讀數(shù)。Oracle和MySQL的IO實在是太慢了!

 

5.        二進制方式

我們進一步再看使用二進制方式的存儲格式的讀取性能,并和文本比對。

為了對比明顯,這次換一個更大的表,用TPCH中的orders表,有3億行數(shù)據(jù),9個字段。

文本讀取的代碼和上面類似,讀取時間測試為438秒。

 

然后,我們將這個文本文件轉(zhuǎn)換成SPL組表,再寫代碼測試:


A
1 =now() /記錄時間
2 =file("/home/sjr/ctx/orders.ctx").create() /產(chǎn)生組表對象
3 =A2.cursor() /生成取數(shù)游標(biāo)
4 for A3,10000 /循環(huán)取數(shù),每次10000條
5 =interval@s(A1,now()) /計算時長

測試結(jié)果是164秒,大概僅僅是文本讀取的三分之一。

這是情理之中的事情,因為二進制數(shù)據(jù)不再需要解析,可以直接產(chǎn)生對象,計算量少了很多,因而要更快。

需要說明的是,組表文件雖然采用列存格式,但在這里讀出了所有列,并沒有比文本少取任何內(nèi)容,沒有占列存的便宜。事實上,因為讀所有列,使用列存還會吃點虧,如果采用SPL集文件(一種行存格式)還會更快。

 

6.        并行提速

從文件中取數(shù)還很容易實現(xiàn)并行,文本和組表都容易寫出并行程序。還是用上面的orders表為例來測試,使用4線程取數(shù)。

文本取數(shù)代碼:


ABC
1 >n=4 /n是并行數(shù) =now()
2 =file("/home/sjr/tpch_2_17_0/tbls/orders.tbl")
3 fork to(n) =A2.cursor(;A3:n, "|") 多線程產(chǎn)生游標(biāo),每個游標(biāo)只取4段中的一段
4
for B3, 10000
5 =interval@s(C1,now())

組表取數(shù)代碼:


ABC
1 >n=4 /n是并行數(shù) =now()
2 =file("/home/sjr/ctx/orders.ctx").create()
3 fork to(n) =A2.cursor(;;A3:n) 多線程產(chǎn)生游標(biāo),每個游標(biāo)只取4段中的一段
4
for B3, 10000
5 =interval@s(C1,now())

用SPL很容易實現(xiàn)數(shù)據(jù)分段和并行計算。

 

測試結(jié)果為:

文本       119秒

組表       43秒

與串行相比,接近了線性提升,將CPU的多核充分利用起來了。

 

       數(shù)據(jù)庫中的數(shù)據(jù)則不容易簡單地實施分段并行,需要用WHERE條件去拼,結(jié)果很難說清到底是并行不力還是WHERE執(zhí)行損失太多,測試結(jié)果的參考意義就打折扣了,這里就不再做了。

 

7.        結(jié)論

數(shù)據(jù)庫(Oracle和MySQL)的JDBC性能非常非常差!比文本文件還要差5倍以上。而采用二進制數(shù)據(jù)時,會比文本再提高3倍的讀取性能。也就是說,合理格式的二進制文件會比數(shù)據(jù)庫有15倍以上的優(yōu)勢。再考慮到并行因素,比數(shù)據(jù)庫快出幾十上百倍也是完全可能的。

在關(guān)注性能且數(shù)據(jù)量較大時,千萬不要把數(shù)據(jù)讀出數(shù)據(jù)庫計算!

如果實在需要讀出后再計算(有時SQL很難寫出復(fù)雜的過程計算),就不要再用數(shù)據(jù)庫存儲了(大數(shù)據(jù)都是歷史,基本也不再改了,可以事先讀出),用文本都比數(shù)據(jù)庫強,用二進制當(dāng)然更好(推薦使用SPL組表,哈哈)。切不要把時間浪費在讀數(shù)這種非計算任務(wù)上了。

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多