關(guān)于若干數(shù)據(jù)庫(kù)數(shù)據(jù)插入性能的對(duì)比分析
更新時(shí)間:2011年10月18日 10:25:33 作者:
前幾天,苦惱于到底使用哪一種本地?cái)?shù)據(jù)庫(kù)來(lái)存儲(chǔ)部分?jǐn)?shù)據(jù),于是決定做一個(gè)數(shù)據(jù)插入測(cè)試進(jìn)行求證
本地?cái)?shù)據(jù)庫(kù)接觸不多,最早用過(guò)Access,但現(xiàn)在SQLite功能更加強(qiáng)大--而且,說(shuō)實(shí)在的我不喜歡Access,連帶著不喜歡SqlServer,只要一看到滿(mǎn)眼的@號(hào)go號(hào)我就頭暈不止;更何況有一個(gè)我感覺(jué)非常致命的問(wèn)題:分頁(yè)太麻煩!遠(yuǎn)不如mySql/SQLite中的limit或者Oracle中的rownum來(lái)得痛快。
平時(shí)基本使用Oracle,對(duì)它的性能知根知底了;mySql近年來(lái)混得風(fēng)生水起,想必有過(guò)人之處,也一并納入測(cè)試范圍了。
另外,Access現(xiàn)在有2007版,不知道和2003版在性能上有什么區(qū)別沒(méi)有?特意分開(kāi)進(jìn)行測(cè)試。
測(cè)試環(huán)境如下:
服務(wù)器:本機(jī)(筆記本,I3 370,8G內(nèi)存)
操作系統(tǒng):windows 7 x64
語(yǔ)言環(huán)境:C#,使用控制臺(tái)程序測(cè)試。
虛擬機(jī):安裝SqlServer2008,2CPU,3G內(nèi)存。
數(shù)據(jù)庫(kù):Oracle11g(本機(jī)數(shù)據(jù)庫(kù))
SQLite(本機(jī)文件)
MySql(版本5的綠色版)
SqlServer(不想在本機(jī)安裝2008版本,本來(lái)想使用本機(jī)的學(xué)習(xí)版,但死活不行,只好在本機(jī)虛擬機(jī)上安裝一個(gè)2008版本,測(cè)試性能有所下降,但也只好如此了)
Access(2003版)
Access(2007版)
測(cè)試方法:先生成10000條記錄(每條記錄6個(gè)字段),插入數(shù)據(jù)前先清除原有數(shù)據(jù);
數(shù)據(jù)插入分為事務(wù)性寫(xiě)入(啟動(dòng)事務(wù),逐條插入后提交)及非事務(wù)性寫(xiě)入(不啟動(dòng)事務(wù),逐條插入)。
SqlServer數(shù)據(jù)庫(kù)在本地虛擬機(jī)的數(shù)據(jù)庫(kù)中,數(shù)據(jù)不太準(zhǔn)確;為消除網(wǎng)絡(luò)操作影響,將代碼移到虛擬中直接執(zhí)行一次。
測(cè)試過(guò)程中發(fā)現(xiàn)了若干有趣的問(wèn)題:
1.64位操作系統(tǒng)下,Access無(wú)法在編譯為AnyCpu的程序下執(zhí)行,必須編譯為x86方可正常操作。(如果是網(wǎng)站,必須將池設(shè)置為啟用32位兼容)
2.SQLite有64位版本的DLL,可以正常在64位環(huán)境(控制臺(tái)程序)下運(yùn)行;但很奇怪的是,如果是網(wǎng)站,則使用64位DLL反而無(wú)法正常運(yùn)行,必須使用32位版本的DLL,并且將IIS的池設(shè)置為啟用32位兼容才可正常運(yùn)行。
3.Access的2003版本與2007版本的數(shù)據(jù)庫(kù)連接串是不相同的,如下:
2003:@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\xxx\test.mdb";
2007:@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=D:\xxx\test.accdb";
測(cè)試結(jié)果如下:
結(jié)果很有意思:
1.SQLite的事務(wù)插入速度最快,達(dá)到10000條每秒,但非事務(wù)性的插入速度就一般了。
2.Oracle作為數(shù)據(jù)庫(kù)的老大,事務(wù)插入速度僅次于SQLite,但非事務(wù)性的插入速度居首。
3.可憐Access,不試不知道,一試嚇一跳,事務(wù)插入最慢,非事務(wù)插入更慢;本來(lái)對(duì)Access2007還有點(diǎn)期待的,沒(méi)想到它比2003版本的數(shù)據(jù)還差。
4.mySql還真是不賴(lài),事務(wù)插入的性能僅次于Oracle,非事務(wù)性的插入沒(méi)有那么強(qiáng),但也還不錯(cuò)。
從數(shù)據(jù)來(lái)看,發(fā)覺(jué)一個(gè)比較有規(guī)律的現(xiàn)象:大型數(shù)據(jù)庫(kù)與小型數(shù)據(jù)庫(kù)、本地型數(shù)據(jù)庫(kù)的區(qū)別,不在于事務(wù)性插入性能的高低,而在于非事務(wù)性插入性能的高低。Oracle最強(qiáng),每秒達(dá)到1000條以上;其次是SqlServer,也有700條每秒;mySql相比之下就差多了,只達(dá)到240條每秒左右,這個(gè)性能整整差了一個(gè)等級(jí);比較意外的是SQLite,非事務(wù)性插入性能雖然比mySql差一點(diǎn),但也相差不大(不是數(shù)量級(jí)的差別);最糟糕的是Access,非事務(wù)數(shù)據(jù)插入性能慘不忍睹,和SQLite相比,整整差了一個(gè)數(shù)量級(jí)。
由上可見(jiàn),如果選擇本地?cái)?shù)據(jù)庫(kù),SQLite應(yīng)該是首選。而且在應(yīng)用中還應(yīng)該注意,盡可能把數(shù)據(jù)集中起來(lái)進(jìn)行事務(wù)性數(shù)據(jù)寫(xiě)入,如此可以大大提升該數(shù)據(jù)庫(kù)的性能。
平時(shí)基本使用Oracle,對(duì)它的性能知根知底了;mySql近年來(lái)混得風(fēng)生水起,想必有過(guò)人之處,也一并納入測(cè)試范圍了。
另外,Access現(xiàn)在有2007版,不知道和2003版在性能上有什么區(qū)別沒(méi)有?特意分開(kāi)進(jìn)行測(cè)試。
測(cè)試環(huán)境如下:
服務(wù)器:本機(jī)(筆記本,I3 370,8G內(nèi)存)
操作系統(tǒng):windows 7 x64
語(yǔ)言環(huán)境:C#,使用控制臺(tái)程序測(cè)試。
虛擬機(jī):安裝SqlServer2008,2CPU,3G內(nèi)存。
數(shù)據(jù)庫(kù):Oracle11g(本機(jī)數(shù)據(jù)庫(kù))
SQLite(本機(jī)文件)
MySql(版本5的綠色版)
SqlServer(不想在本機(jī)安裝2008版本,本來(lái)想使用本機(jī)的學(xué)習(xí)版,但死活不行,只好在本機(jī)虛擬機(jī)上安裝一個(gè)2008版本,測(cè)試性能有所下降,但也只好如此了)
Access(2003版)
Access(2007版)
測(cè)試方法:先生成10000條記錄(每條記錄6個(gè)字段),插入數(shù)據(jù)前先清除原有數(shù)據(jù);
數(shù)據(jù)插入分為事務(wù)性寫(xiě)入(啟動(dòng)事務(wù),逐條插入后提交)及非事務(wù)性寫(xiě)入(不啟動(dòng)事務(wù),逐條插入)。
SqlServer數(shù)據(jù)庫(kù)在本地虛擬機(jī)的數(shù)據(jù)庫(kù)中,數(shù)據(jù)不太準(zhǔn)確;為消除網(wǎng)絡(luò)操作影響,將代碼移到虛擬中直接執(zhí)行一次。
測(cè)試過(guò)程中發(fā)現(xiàn)了若干有趣的問(wèn)題:
1.64位操作系統(tǒng)下,Access無(wú)法在編譯為AnyCpu的程序下執(zhí)行,必須編譯為x86方可正常操作。(如果是網(wǎng)站,必須將池設(shè)置為啟用32位兼容)
2.SQLite有64位版本的DLL,可以正常在64位環(huán)境(控制臺(tái)程序)下運(yùn)行;但很奇怪的是,如果是網(wǎng)站,則使用64位DLL反而無(wú)法正常運(yùn)行,必須使用32位版本的DLL,并且將IIS的池設(shè)置為啟用32位兼容才可正常運(yùn)行。
3.Access的2003版本與2007版本的數(shù)據(jù)庫(kù)連接串是不相同的,如下:
2003:@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\xxx\test.mdb";
2007:@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=D:\xxx\test.accdb";
測(cè)試結(jié)果如下:
| 數(shù)據(jù)庫(kù)類(lèi)別 | 插入數(shù)量 | 本地事務(wù)(毫秒) | 本地?zé)o事務(wù)(毫秒) | 說(shuō)明 | ||
| 每條記錄耗時(shí) | 每秒插入條數(shù) | 每條記錄耗時(shí) | 每秒插入條數(shù) | |||
| Oracle | 10000 | 0.23 | 4300 | 0.9 | 1103 | 本地?cái)?shù)據(jù)庫(kù) |
| Sqlite | 10000 | 0.0998 | 10016 | 6.86 | 146 | 本地?cái)?shù)據(jù)庫(kù) |
| MySql | 10000 | 0.2574 | 3884 | 4.132 | 241 | 本地?cái)?shù)據(jù)庫(kù) |
| Sql Server | 10000 | 0.42 | 2380 | 1.52 | 654 | 遠(yuǎn)程數(shù)據(jù)庫(kù) |
| Sql Server | 10000 | 0.413 | 2418 | 1.433 | 697 | 本地?cái)?shù)據(jù)庫(kù),2CPU,2G內(nèi)存 代碼直接在虛擬機(jī)運(yùn)行 |
| Access2003 | 10000 | 0.6 | 1664 | 46.87 | 21.33 | 本地?cái)?shù)據(jù)庫(kù) |
| Access2007 | 10000 | 0.73 | 1369 | 47.57 | 21.02 | 本地?cái)?shù)據(jù)庫(kù) |
1.SQLite的事務(wù)插入速度最快,達(dá)到10000條每秒,但非事務(wù)性的插入速度就一般了。
2.Oracle作為數(shù)據(jù)庫(kù)的老大,事務(wù)插入速度僅次于SQLite,但非事務(wù)性的插入速度居首。
3.可憐Access,不試不知道,一試嚇一跳,事務(wù)插入最慢,非事務(wù)插入更慢;本來(lái)對(duì)Access2007還有點(diǎn)期待的,沒(méi)想到它比2003版本的數(shù)據(jù)還差。
4.mySql還真是不賴(lài),事務(wù)插入的性能僅次于Oracle,非事務(wù)性的插入沒(méi)有那么強(qiáng),但也還不錯(cuò)。
從數(shù)據(jù)來(lái)看,發(fā)覺(jué)一個(gè)比較有規(guī)律的現(xiàn)象:大型數(shù)據(jù)庫(kù)與小型數(shù)據(jù)庫(kù)、本地型數(shù)據(jù)庫(kù)的區(qū)別,不在于事務(wù)性插入性能的高低,而在于非事務(wù)性插入性能的高低。Oracle最強(qiáng),每秒達(dá)到1000條以上;其次是SqlServer,也有700條每秒;mySql相比之下就差多了,只達(dá)到240條每秒左右,這個(gè)性能整整差了一個(gè)等級(jí);比較意外的是SQLite,非事務(wù)性插入性能雖然比mySql差一點(diǎn),但也相差不大(不是數(shù)量級(jí)的差別);最糟糕的是Access,非事務(wù)數(shù)據(jù)插入性能慘不忍睹,和SQLite相比,整整差了一個(gè)數(shù)量級(jí)。
由上可見(jiàn),如果選擇本地?cái)?shù)據(jù)庫(kù),SQLite應(yīng)該是首選。而且在應(yīng)用中還應(yīng)該注意,盡可能把數(shù)據(jù)集中起來(lái)進(jìn)行事務(wù)性數(shù)據(jù)寫(xiě)入,如此可以大大提升該數(shù)據(jù)庫(kù)的性能。
相關(guān)文章
victoriaMetrics代理性能優(yōu)化問(wèn)題解析
這篇文章主要為大家介紹了victoriaMetrics代理性能優(yōu)化問(wèn)題的解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪2022-04-04
一文弄懂?dāng)?shù)據(jù)庫(kù)設(shè)計(jì)的三范式
面試中經(jīng)常會(huì)問(wèn)到的數(shù)據(jù)庫(kù)三范式指的是什么,本文主要介紹了數(shù)據(jù)庫(kù)設(shè)計(jì)的三范式,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07
在Windows下自動(dòng)備份PostgreSQL的教程
這篇文章主要介紹了在Windows下自動(dòng)備份PostgreSQL的教程,主要通過(guò)編寫(xiě)一個(gè)簡(jiǎn)單的批處理腳本,需要的朋友可以參考下2015-04-04
redis數(shù)據(jù)庫(kù)查找key在內(nèi)存中的位置的方法
這篇文章主要介紹了redis數(shù)據(jù)庫(kù)查找key在內(nèi)存中的位置的方法,需要的朋友可以參考下2014-03-03
idea中連接數(shù)據(jù)庫(kù)時(shí)出現(xiàn)SSL錯(cuò)誤的問(wèn)題
這篇文章主要介紹了idea中連接數(shù)據(jù)庫(kù)是出現(xiàn)SSL錯(cuò)誤的問(wèn)題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-10-10
dbeaver創(chuàng)建create臨時(shí)表之后查詢(xún)不到問(wèn)題排查及解決方案
文章介紹了在使用DBeaver創(chuàng)建臨時(shí)表后無(wú)法查詢(xún)到數(shù)據(jù)的問(wèn)題排查過(guò)程,主要步驟包括檢查表名唯一性、確認(rèn)會(huì)話(huà)正確性、清理會(huì)話(huà)、檢查權(quán)限、語(yǔ)法檢查以及刷新視圖或重啟工具,感興趣的朋友跟隨小編一起看看吧2025-01-01
大數(shù)據(jù)量時(shí)提高分頁(yè)的效率
當(dāng)我們?cè)谔幚泶罅繑?shù)據(jù)的時(shí)候,就需要注意分頁(yè)的效率問(wèn)題了,下面大家可以看看2009-03-03
解決Navicat數(shù)據(jù)庫(kù)連接成功但密碼忘記的問(wèn)題
這篇文章給大家介紹了Navicat數(shù)據(jù)庫(kù)連接成功,密碼忘記如何解決,文中給大家介紹了兩種解決方法,有詳細(xì)的圖文講解,需要的朋友可以參考下2023-08-08

