Oracle 和 MySQL 的 JDBC 終歸有多慢?


假如真個需要讀出後再計算(有時SQL很難開具復雜的過程計算),就不要再用數據倉儲儲了(大數據都是歷史,基本也不再改了,可以事先讀出),用文本都比數據庫強,用二進制當然更好(引薦使役SPL組表,哈哈)。切不要把時間浪費在讀數這種非計算任務上了。
在關注性能且數據量較大時,千萬不要把數據讀出數據庫計算!
7.??????? 結論數據庫(Oracle和MySQL)的JDBC性能十分十分差!比文本文件還要差5倍以上。而采用二進制數據時,會比文本再增長3倍的讀取性能。也就是說,合理款式的二進制文件會比數據庫有15倍以上的優勢。再考量到並行因素,比數據庫快出幾十上百倍也是純粹可能的。
?
?????? 數據庫中的數據則不由得易簡單地實行分段並行,需要用WHERE條件去拼,結果很難說清終歸是並行不力仍然WHERE執行虧折太多,測試結果的參考意義就打折扣扣了,這搭就不再做了。
?
與串行相形,靠近了線性提高,將CPU的多核充分利用起來了。
組表?????? 43秒
文本?????? 119秒
測試結果為:
?

ABC

1>n=4/n是並行數=now()2=file(“/home/sjr/ctx/orders.ctx”).create()
3fork to(n)=A2.cursor(;;A3:n)多線程萌生游標,每個游標只取4段中的一段4
for B3, 10000
5=interval@s(C1,now())

用SPL很容易實行數據分段和並行計算。

ABC

1>n=4/n是並行數=now()2=file(“/home/sjr/tpch_2_17_0/tbls/orders.tbl”)
3fork to(n)=A2.cursor(;A3:n, “”)多線程萌生游標,每個游標只取4段中的一段4
for B3, 10000
5=interval@s(C1,now())

組表取數代碼:
文本取數代碼:
6.??????? 並行提速從文件中取數還很容易實行並行,文本和組表都容易開具並行手續。仍然用上頭的orders表為例來測試,使役4線程取數。
?
需要申說的是,組表文件雖然采用列存款式,但在這搭讀出了所有列,並沒有比文本少取任何內容,沒有佔列存的便宜。事實上,因為讀所有列,使役列存還會吃點虧,假如采用SPL集文件(一種行存款式)還會更快。
這是情理該中的事體,因為二進制數據不再需要解析,可以直接萌生對象,計算量少了眾多,故而要更快。

A

1=now()/記錄時間2=file(“/home/sjr/ctx/orders.ctx”).create()/萌生組表對象3=A2.cursor()/生成取數游標4for A3,10000/循環取數,每每10000條5=interval@s(A1,now())/計算時長測試結果是164秒,約略僅只是文本讀取的三分之一。
而後,我們將這個文本文件轉換成SPL組表,再寫代碼測試:
?
文本讀取的代碼和上頭類似,讀取時間測試為438秒。
為了對比表面化,這次換一個更大的表,用TPCH中的orders表,有3億行數據,9個字段。
5.??????? 二進制形式我們進一步再看使役二進制形式的存儲款式的讀取性能,並和文本比對。
?
我們曉得,文本解析是個十分麻煩的事體,但縱然這麼,從文本文件讀取數據仍然遠遠快於從數據庫中讀數。Oracle和MySQL的IO真個是太慢了!
這意味著,讀取文本要比讀取Oracle快281/42=6.69倍,比MySQL要快381/42=9.07倍!

A

1=now()/記錄時間2=file(“/home/sjr/tbl/customer.tbl”)/萌生文件對象3=A2.cursor(;,””)/生成取數游標,分隔符是4for A3,10000/循環取數,每每10000條5=interval@s(A1,now())/計算時長測試結果是42秒!
編著如次SPL腳本執行測試:
4.??????? 文本文件對比只從上頭的數據量還沒有太多感性意識,我們再讀一下文本文件來對比。法子是同樣的,從文件中讀出數據,並解析出記錄,不作任何計算。
?

首屆第二次每秒行數Oracle293281106KMySQL51838179K第二次可能因為操作系統有了硬盤緩存,所以更快。因為我們主要是為了測試JDBC的讀取時間,所以就以第二次為准,減損數據庫本身從硬盤讀數的影響。每秒讀遠門數也是按第二次時間來計算的,也就是說,Oracle每秒能讀出10萬行多數據,MySQL約略靠近8萬行。當然這個值和表的字段數及類型都相關(customer表有8個字段),只是一種參考。
測試結果(時間單位:秒)
?
MySQL的測試代碼類似,不再贅述。

A

1=now()/記錄時間2=connect(“oracle”)/連署數據3=A2.cursor(“select * from customer”)/生成取數游標4for A3,10000/循環取數,每每10000條5=A2.close()/關閉連署6=interval@s(A1,now())/計算時長?
Java寫起來麻煩,用SPL腳本執行測試:
3.??????? 數據庫讀數測試經過Oracle提供的JDBC接口,用SQL語句執行數據讀取。
所有測試均在服務器本機上完成,沒有耗費網絡傳輸時間。
2.??????? 測試背景在一臺Intel服務器上完成測試,2個Intel2670 CPU,主頻2.6G,共16核,內存64G。數據庫表數據及文本文件均存儲在同一塊SSD硬盤上。
1.??????? 數據出處使役TPCH生成的數據,選用其中的customer表來做測試,數據記錄為3000萬行,8個字段。它生成的原始文本文件名為customer.tbl,文件體積為4.9G。利用數據庫提供的數據導入工具將此文件數據導入到Oracle和MySQL的數據表中。
之所以測試JDBC,是因為大多應用是JAVA寫的,也就只能用JDBC來過訪數據。這搭僅測試用JDBC讀出數據,並萌生成Java的記錄對象(畢竟到達這一步能力在應用中使役),不作任何計算。
main-content editor-side-new”>
常常聽人說,數據庫的IO性能不佳,但說歸說,並沒有感性意識。我們如今就來實際測試一下,常用的Oracle和MySQL的JDBC讀取性能若何。


發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *