SQLite 與 Microsoft Access MDB 相比有多快?
目前,我正在考慮用 SQlite 數據庫替換在單使用者 .NET C# Windows 窗體應用程序上使用 Microsoft Jet MDB 數據庫。
我的目標是降低安裝要求,例如 Jet 驅動程序和 Jet 安裝損壞時的一些嚴重錯誤(我們有客戶不時報告這些錯誤)。
我關於性能的問題是:
是否有任何性能基準比較 MDB 和 SQLite 在相當小的數據集上?
或者是否有任何開發人員已經完成了這一步,並且可以根據自己的經驗講述一些故事?
(我現在正在Google搜尋幾個小時沒有成功)
更新
儘管數據庫不包含那麼多記錄和表,但我認為性能仍然是一個問題,因為數據被經常訪問。
該應用程序是呈現 HTML 頁面的所謂“桌面 CMS 系統”;在渲染過程中,正在訪問大量數據並執行大量 SQL 查詢。
更新 2
剛剛找到了這個文件,它表明了一些速度比較,不幸的是,據我所知,MDB 沒有。
更新 3
根據要求,一些數字:
- 大約 數據庫中有 30 個表。
- 大多數表的記錄低於 100 條。
- 大約 5 個表,通常有幾百條到幾千條記錄。
- 一個大的 MDB 文件大約為 60 MB。
更新 4
換個說法:我對目前的 MDB 實現沒有任何性能問題。我問這個問題是為了了解使用 SQLite 而不是 MDB 時性能是否相同(或更好)。
4 年多之後,我實際上在 MDB 和 SQLite 之間做了一個小型(可能有點幼稚)的性能比較測試。
我還添加了更多數據庫。
我測試過的數據庫
- SQL Server Express 2014 在與測試應用程序相同的本地 PC 和本地 SSD 驅動器上。
- 千兆 LAN 中的伺服器上的 SQL Server Express 2014。
- SQL Server Compact (CE) 與測試應用程序位於同一本地 PC 和本地 SSD 驅動器上。
- Microsoft Access MDB/Jet 在與測試應用程序相同的本地 PC 和本地 SSD 驅動器上。
- Microsoft SQLite 在與測試應用程序相同的本地 PC 和本地 SSD 驅動器上。
- Microsoft VistaDB 5 在與測試應用程序相同的本地 PC 和本地 SSD 驅動器上。
由於有些數據庫不支持連接池,所以我做了兩個測試:
using通過一個塊盡快關閉連接的一項測試。- 另一個測試,在整個應用程序生命週期內始終打開每個數據庫的連接
立即關閉連接時的測試結果
- 在本地執行的 SQL Express 是最快的。
- 我們本地網路上的 SQL Express 排名第二。
- SQL Compact Edition (CE) 比 SQLite 和 Jet/MDB 快得多。
- Jet/MDB 比 SQLite 快一點,但比 SQL CE 慢得多。
- SQLite 比 Jet/MDB 慢一點。
- VistaDB 5 是我測試中最慢的數據庫。
保持連接打開時的測試結果
結果與立即關閉連接時的結果非常相似。
相對而言,從最快到最慢的順序並沒有改變。一些沒有實際連接池的數據庫大大提高了它們的絕對性能。
- 在本地執行的 SQL Express 是最快的。
- 我們本地網路上的 SQL Express 排名第二。
- SQL Compact Edition (CE) 比 SQLite 和 Jet/MDB 快得多。
- Jet/MDB 比 SQLite 快一點,但比 SQL CE 慢得多。
- SQLite 比 Jet/MDB 慢一點。
- VistaDB 5 是我測試中最慢的數據庫。
立即關閉連接時我的測試應用程序的詳細輸出
1.: 1 x DELETE FROM Tabelle1 (Closing connections): - SQL Express local : 00:00:00.1723705 - SQL Express remote: 00:00:00.2093229 - SQL CE : 00:00:00.3141897 - MS Access : 00:00:00.3854029 - SQLite : 00:00:00.4639365 - VistaDB : 00:00:00.9699047 2.: 1 x INSERT INTO Tabelle1 (Name1, Wert1) VALUES ({LOOPCTR}, '{LOOPCTR}') (Closing connections): - SQL Express local : 00:00:00.0039836 - SQL Express remote: 00:00:00.0062002 - SQL CE : 00:00:00.0432679 - MS Access : 00:00:00.0817834 - SQLite : 00:00:00.0933030 - VistaDB : 00:00:00.1200426 3.: 10 x INSERT INTO Tabelle1 (Name1, Wert1) VALUES ({LOOPCTR}, '{LOOPCTR}') (Closing connections): - SQL Express local : 00:00:00.0031593 - SQL Express remote: 00:00:00.0142514 - SQL CE : 00:00:00.3724224 - MS Access : 00:00:00.7474003 - SQLite : 00:00:00.8818905 - VistaDB : 00:00:00.9342783 4.: 100 x INSERT INTO Tabelle1 (Name1, Wert1) VALUES ({LOOPCTR}, '{LOOPCTR}') (Closing connections): - SQL Express local : 00:00:00.0242817 - SQL Express remote: 00:00:00.1124771 - SQL CE : 00:00:03.6239390 - MS Access : 00:00:07.3752378 - SQLite : 00:00:08.6489843 - VistaDB : 00:00:09.0933903 5.: 1000 x INSERT INTO Tabelle1 (Name1, Wert1) VALUES ({LOOPCTR}, '{LOOPCTR}') (Closing connections): - SQL Express local : 00:00:00.2735537 - SQL Express remote: 00:00:01.2657006 - SQL CE : 00:00:36.2335727 - MS Access : 00:01:13.8782439 - SQLite : 00:01:27.1783328 - VistaDB : 00:01:32.0760340 6.: 1 x SELECT * FROM Tabelle1 (Closing connections): - SQL Express local : 00:00:00.0520670 - SQL Express remote: 00:00:00.0570562 - SQL CE : 00:00:00.1026963 - MS Access : 00:00:00.1646635 - SQLite : 00:00:00.1785981 - VistaDB : 00:00:00.2311263 7.: 10 x SELECT * FROM Tabelle1 (Closing connections): - SQL Express local : 00:00:00.0183055 - SQL Express remote: 00:00:00.0501115 - SQL CE : 00:00:00.3235680 - MS Access : 00:00:00.7119203 - SQLite : 00:00:00.7533361 - VistaDB : 00:00:00.9804508 8.: 100 x SELECT * FROM Tabelle1 (Closing connections): - SQL Express local : 00:00:00.1787837 - SQL Express remote: 00:00:00.4321814 - SQL CE : 00:00:03.0401779 - MS Access : 00:00:06.8338598 - SQLite : 00:00:07.2000139 - VistaDB : 00:00:09.1889217 9.: 1000 x SELECT * FROM Tabelle1 (Closing connections): - SQL Express local : 00:00:01.6112566 - SQL Express remote: 00:00:03.9542611 - SQL CE : 00:00:29.1209991 - MS Access : 00:01:07.2309769 - SQLite : 00:01:10.3167922 - VistaDB : 00:01:31.4312770 10.: 1 x SELECT a.* FROM Tabelle1 a LEFT JOIN Tabelle1 b ON a.ID=b.ID ORDER BY a.ID (Closing connections): - SQL Express local : 00:00:00.0029406 - SQL Express remote: 00:00:00.0088138 - SQL CE : 00:00:00.0498847 - MS Access : 00:00:00.0893892 - SQLite : 00:00:00.0929506 - VistaDB : 00:00:00.2575795 11.: 10 x SELECT a.* FROM Tabelle1 a LEFT JOIN Tabelle1 b ON a.ID=b.ID ORDER BY a.ID (Closing connections): - SQL Express local : 00:00:00.0174026 - SQL Express remote: 00:00:00.0400797 - SQL CE : 00:00:00.3408818 - MS Access : 00:00:00.7314978 - SQLite : 00:00:00.7653330 - VistaDB : 00:00:01.9565675 12.: 100 x SELECT a.* FROM Tabelle1 a LEFT JOIN Tabelle1 b ON a.ID=b.ID ORDER BY a.ID (Closing connections): - SQL Express local : 00:00:00.1565402 - SQL Express remote: 00:00:00.3787208 - SQL CE : 00:00:03.3516629 - MS Access : 00:00:07.2521126 - SQLite : 00:00:07.5618047 - VistaDB : 00:00:19.5181391 13.: 1000 x SELECT a.* FROM Tabelle1 a LEFT JOIN Tabelle1 b ON a.ID=b.ID ORDER BY a.ID (Closing connections): - SQL Express local : 00:00:01.5686470 - SQL Express remote: 00:00:03.7414669 - SQL CE : 00:00:35.3944204 - MS Access : 00:01:14.6872377 - SQLite : 00:01:17.9964955 - VistaDB : 00:03:18.1902279 14.: 1 x SELECT a.* FROM Tabelle1 a LEFT JOIN Tabelle1 b ON a.ID=b.ID WHERE a.ID < 100 OR a.ID > 300 ORDER BY a.ID (Closing connections): - SQL Express local : 00:00:00.0053295 - SQL Express remote: 00:00:00.0089722 - SQL CE : 00:00:00.0395485 - MS Access : 00:00:00.0797776 - SQLite : 00:00:00.0833477 - VistaDB : 00:00:00.2554930 15.: 10 x SELECT a.* FROM Tabelle1 a LEFT JOIN Tabelle1 b ON a.ID=b.ID WHERE a.ID < 100 OR a.ID > 300 ORDER BY a.ID (Closing connections): - SQL Express local : 00:00:00.0168467 - SQL Express remote: 00:00:00.0552233 - SQL CE : 00:00:00.3929877 - MS Access : 00:00:00.7886399 - SQLite : 00:00:00.8209904 - VistaDB : 00:00:02.1248734 16.: 100 x SELECT a.* FROM Tabelle1 a LEFT JOIN Tabelle1 b ON a.ID=b.ID WHERE a.ID < 100 OR a.ID > 300 ORDER BY a.ID (Closing connections): - SQL Express local : 00:00:00.1705345 - SQL Express remote: 00:00:00.3969228 - SQL CE : 00:00:03.4886826 - MS Access : 00:00:07.4564258 - SQLite : 00:00:07.7828646 - VistaDB : 00:00:20.4092926 17.: 1000 x SELECT a.* FROM Tabelle1 a LEFT JOIN Tabelle1 b ON a.ID=b.ID WHERE a.ID < 100 OR a.ID > 300 ORDER BY a.ID (Closing connections): - SQL Express local : 00:00:01.6237424 - SQL Express remote: 00:00:03.9816212 - SQL CE : 00:00:35.1441759 - MS Access : 00:01:14.7739758 - SQLite : 00:01:17.9477049 - VistaDB : 00:03:24.0049633保持連接打開時我的測試應用程序的詳細輸出
1.: 1 x DELETE FROM Tabelle1 (keeping connection open): - SQL Express local : 00:00:00.0426930 - SQL Express remote: 00:00:00.0546357 - SQL CE : 00:00:00.0786765 - MS Access : 00:00:00.0909099 - SQLite : 00:00:00.1101572 - VistaDB : 00:00:00.4637726 2.: 1 x INSERT INTO Tabelle1 (Name1, Wert1) VALUES ({LOOPCTR}, '{LOOPCTR}') (keeping connection open): - SQL Express local : 00:00:00.0030936 - SQL Express remote: 00:00:00.0051136 - SQL CE : 00:00:00.0054226 - MS Access : 00:00:00.0074847 - SQLite : 00:00:00.0154474 - VistaDB : 00:00:00.0373701 3.: 10 x INSERT INTO Tabelle1 (Name1, Wert1) VALUES ({LOOPCTR}, '{LOOPCTR}') (keeping connection open): - SQL Express local : 00:00:00.0023271 - SQL Express remote: 00:00:00.0109913 - SQL CE : 00:00:00.0119872 - MS Access : 00:00:00.0152531 - SQLite : 00:00:00.1131698 - VistaDB : 00:00:00.1261859 4.: 100 x INSERT INTO Tabelle1 (Name1, Wert1) VALUES ({LOOPCTR}, '{LOOPCTR}') (keeping connection open): - SQL Express local : 00:00:00.0201695 - SQL Express remote: 00:00:00.0888872 - SQL CE : 00:00:00.0966017 - MS Access : 00:00:00.1256167 - SQLite : 00:00:01.3632978 - VistaDB : 00:00:01.9422151 5.: 1000 x INSERT INTO Tabelle1 (Name1, Wert1) VALUES ({LOOPCTR}, '{LOOPCTR}') (keeping connection open): - SQL Express local : 00:00:00.1693362 - SQL Express remote: 00:00:00.9181297 - SQL CE : 00:00:01.0366334 - MS Access : 00:00:01.2794199 - SQLite : 00:00:13.9398816 - VistaDB : 00:00:19.8319476 6.: 1 x SELECT * FROM Tabelle1 (keeping connection open): - SQL Express local : 00:00:00.0481500 - SQL Express remote: 00:00:00.0507066 - SQL CE : 00:00:00.0738698 - MS Access : 00:00:00.0911707 - SQLite : 00:00:00.1012425 - VistaDB : 00:00:00.1515495 7.: 10 x SELECT * FROM Tabelle1 (keeping connection open): - SQL Express local : 00:00:00.0157947 - SQL Express remote: 00:00:00.0692206 - SQL CE : 00:00:00.0898558 - MS Access : 00:00:00.1196514 - SQLite : 00:00:00.1400944 - VistaDB : 00:00:00.3227485 8.: 100 x SELECT * FROM Tabelle1 (keeping connection open): - SQL Express local : 00:00:00.1517498 - SQL Express remote: 00:00:00.3399897 - SQL CE : 00:00:00.5497382 - MS Access : 00:00:00.8619646 - SQLite : 00:00:01.0463369 - VistaDB : 00:00:02.8607334 9.: 1000 x SELECT * FROM Tabelle1 (keeping connection open): - SQL Express local : 00:00:01.5042900 - SQL Express remote: 00:00:03.8431985 - SQL CE : 00:00:05.9075477 - MS Access : 00:00:09.2642402 - SQLite : 00:00:11.4427914 - VistaDB : 00:00:30.8470936 10.: 1 x SELECT a.* FROM Tabelle1 a LEFT JOIN Tabelle1 b ON a.ID=b.ID ORDER BY a.ID (keeping connection open): - SQL Express local : 00:00:00.0033803 - SQL Express remote: 00:00:00.0062499 - SQL CE : 00:00:00.0141105 - MS Access : 00:00:00.0188573 - SQLite : 00:00:00.0208236 - VistaDB : 00:00:00.1796513 11.: 10 x SELECT a.* FROM Tabelle1 a LEFT JOIN Tabelle1 b ON a.ID=b.ID ORDER BY a.ID (keeping connection open): - SQL Express local : 00:00:00.0168644 - SQL Express remote: 00:00:00.0377185 - SQL CE : 00:00:00.1121558 - MS Access : 00:00:00.1599104 - SQLite : 00:00:00.1799435 - VistaDB : 00:00:01.4042534 12.: 100 x SELECT a.* FROM Tabelle1 a LEFT JOIN Tabelle1 b ON a.ID=b.ID ORDER BY a.ID (keeping connection open): - SQL Express local : 00:00:00.1547275 - SQL Express remote: 00:00:00.3692526 - SQL CE : 00:00:01.1215470 - MS Access : 00:00:01.5577172 - SQLite : 00:00:01.7519790 - VistaDB : 00:00:14.5687575 13.: 1000 x SELECT a.* FROM Tabelle1 a LEFT JOIN Tabelle1 b ON a.ID=b.ID ORDER BY a.ID (keeping connection open): - SQL Express local : 00:00:01.4992800 - SQL Express remote: 00:00:03.7601806 - SQL CE : 00:00:11.1738426 - MS Access : 00:00:15.8112902 - SQLite : 00:00:17.8045042 - VistaDB : 00:02:21.4492368 14.: 1 x SELECT a.* FROM Tabelle1 a LEFT JOIN Tabelle1 b ON a.ID=b.ID WHERE a.ID < 100 OR a.ID > 300 ORDER BY a.ID (keeping connection open): - SQL Express local : 00:00:00.0048145 - SQL Express remote: 00:00:00.0076790 - SQL CE : 00:00:00.0152074 - MS Access : 00:00:00.0204568 - SQLite : 00:00:00.0229056 - VistaDB : 00:00:00.2091614 15.: 10 x SELECT a.* FROM Tabelle1 a LEFT JOIN Tabelle1 b ON a.ID=b.ID WHERE a.ID < 100 OR a.ID > 300 ORDER BY a.ID (keeping connection open): - SQL Express local : 00:00:00.0156564 - SQL Express remote: 00:00:00.0377571 - SQL CE : 00:00:00.1138433 - MS Access : 00:00:00.1598932 - SQLite : 00:00:00.1793267 - VistaDB : 00:00:01.4667061 16.: 100 x SELECT a.* FROM Tabelle1 a LEFT JOIN Tabelle1 b ON a.ID=b.ID WHERE a.ID < 100 OR a.ID > 300 ORDER BY a.ID (keeping connection open): - SQL Express local : 00:00:00.1512625 - SQL Express remote: 00:00:00.4658652 - SQL CE : 00:00:01.2441809 - MS Access : 00:00:01.7224126 - SQLite : 00:00:01.9297231 - VistaDB : 00:00:14.9351318 17.: 1000 x SELECT a.* FROM Tabelle1 a LEFT JOIN Tabelle1 b ON a.ID=b.ID WHERE a.ID < 100 OR a.ID > 300 ORDER BY a.ID (keeping connection open): - SQL Express local : 00:00:01.5223833 - SQL Express remote: 00:00:03.9885174 - SQL CE : 00:00:11.8356048 - MS Access : 00:00:16.5977939 - SQLite : 00:00:18.6504260 - VistaDB : 00:02:26.05130562019 年 4 月更新 1
我做了一些比較 Microsoft Access MDB 和LiteDB的測試,LiteDB是 .NET 的嵌入式數據庫。
再一次,一些相當幼稚的比較,但我仍然想感受一下。
此程式碼執行 1000 次讀取和寫入並產生以下值:
Access of 1000 WRITE iterations took 00:00:39.6488351. LiteDB of 1000 WRITE iterations took 00:00:01.6596646. LiteDB (in-memory) of 1000 WRITE iterations took 00:00:00.1617220. Access of 1000 READ iterations took 00:00:48.8517302. LiteDB of 1000 READ iterations took 00:00:00.0082401. LiteDB (in-memory) of 1000 READ iterations took 00:00:00.0097933.所以在我的場景中,LiteDB比 Access 快得多*。*
2019 年 4 月更新 2
與 VistaDB 5 相比,我還針對 VistaDB 6 Beta 1 執行了我的原始程式碼。
我得到了非常相似的速度結果。VistaDB 6 的 Beta 版比 VistaDB 5 稍慢,很可能是因為它是一個調試版本。
作為結論,我發現在 VistaDB 5 和 VistaDB 6 Beta 1 之間的場景中沒有顯著的性能改進。我將不得不再次嘗試使用 VistaDB 6 的最終版本。