今天有個朋友測試 SQLite,然后得出的結(jié)論是:SQLite 效率太低,批量插入1000條記錄,居然耗時 2 分鐘!
下面是他發(fā)給我的測試代碼。我暈~~~~~~
using System.Data;
using System.Data.Common;
using System.Data.SQLite;
// 創(chuàng)建數(shù)據(jù)庫文件
File.Delete("test1.db3");
SQLiteConnection.CreateFile("test1.db3");
DbProviderFactory factory = SQLiteFactory.Instance;
using (DbConnection conn = factory.CreateConnection())
{
// 連接數(shù)據(jù)庫
conn.ConnectionString = "Data Source=test1.db3";
conn.Open();
// 創(chuàng)建數(shù)據(jù)表
string sql = "create table [test1] ([id] INTEGER PRIMARY KEY, [s] TEXT COLLATE NOCASE)";
DbCommand cmd = conn.CreateCommand();
cmd.Connection = conn;
cmd.CommandText = sql;
cmd.ExecuteNonQuery();
// 添加參數(shù)
cmd.Parameters.Add(cmd.CreateParameter());
// 開始計時
Stopwatch watch = new Stopwatch();
watch.Start();
// 連續(xù)插入1000條記錄
for (int i = 0; i < 1000; i++)
{
cmd.CommandText = "insert into [test1] ([s]) values (?)";
cmd.Parameters[0].Value = i.ToString();
cmd.ExecuteNonQuery();
}
// 停止計時
watch.Stop();
Console.WriteLine(watch.Elapsed);
}
哎~~~~ 一個常識性的錯誤,我加幾行代碼 (新增代碼標記 "// <-------------------")。
using System.Data;
using System.Data.Common;
using System.Data.SQLite;
// 創(chuàng)建數(shù)據(jù)庫文件
File.Delete("test1.db3");
SQLiteConnection.CreateFile("test1.db3");
DbProviderFactory factory = SQLiteFactory.Instance;
using (DbConnection conn = factory.CreateConnection())
{
// 連接數(shù)據(jù)庫
conn.ConnectionString = "Data Source=test1.db3";
conn.Open();
// 創(chuàng)建數(shù)據(jù)表
string sql = "create table [test1] ([id] INTEGER PRIMARY KEY, [s] TEXT COLLATE NOCASE)";
DbCommand cmd = conn.CreateCommand();
cmd.Connection = conn;
cmd.CommandText = sql;
cmd.ExecuteNonQuery();
// 添加參數(shù)
cmd.Parameters.Add(cmd.CreateParameter());
// 開始計時
Stopwatch watch = new Stopwatch();
watch.Start();
DbTransaction trans = conn.BeginTransaction(); // <-------------------
try
{
// 連續(xù)插入1000條記錄
for (int i = 0; i < 1000; i++)
{
cmd.CommandText = "insert into [test1] ([s]) values (?)";
cmd.Parameters[0].Value = i.ToString();
cmd.ExecuteNonQuery();
}
trans.Commit(); // <-------------------
}
catch
{
trans.Rollback(); // <-------------------
throw; // <-------------------
}
// 停止計時
watch.Stop();
Console.WriteLine(watch.Elapsed);
}
執(zhí)行一下,耗時 0.2 秒。這差距是不是太大了點?
為什么只是簡單啟用了一個事務會有這么大的差距呢?很簡單,SQLite 缺省為每個操作啟動一個事務,那么原代碼 1000 次插入起碼開啟了 1000 個事務,"事務開啟 + SQL 執(zhí)行 + 事務關(guān)閉" 自然耗費了大量的時間,這也是后面顯示啟動事務后為什么如此快的原因。其實這是數(shù)據(jù)庫操作的基本常識,大家要緊記,不好的代碼效率差的不是一點半點。
SQLite速度評測代碼
2020-06-01 17:27SQLite教程網(wǎng) Sqlite
SQLite 作為一個輕量級嵌入式數(shù)據(jù)庫,還是非常好用的。雨痕極力推薦~~~~~~
延伸 · 閱讀
- 2022-03-06QT5中使用SQLite的實現(xiàn)方法
- 2022-03-05C# SQLite數(shù)據(jù)庫入門使用說明
- 2022-02-28Python 操作SQLite數(shù)據(jù)庫詳情
- 2022-02-24C# SQLite執(zhí)行效率的優(yōu)化教程
- 2022-01-20SQLite在C#中的安裝與操作技巧
- 2022-01-19CentOS下更新SQLite版本
- Sqlite
SQLite中重置自動編號列的方法
這篇文章主要介紹了SQLite中重置自動編號列的方法,本文講解了3種情況和其對應解決方法,需要的朋友可以參考下 ...
- Sqlite
SQLite 錯誤碼整理
這篇文章主要介紹了SQLite 錯誤碼,方便大家在開發(fā)過程中快速解決問題 ...
- Sqlite
基于sqlite特殊字符轉(zhuǎn)義的實現(xiàn)方法
本篇文章是對sqlite特殊字符轉(zhuǎn)義的實現(xiàn)方法進行了詳細的分析介紹,需要的朋友參考下 ...
- Sqlite
SQLite中的WAL機制詳細介紹
這篇文章主要介紹了SQLite中的WAL機制詳細介紹,本文講解了什么是WAL、WAL如何工作、WAL的優(yōu)點與缺點、WAL引入的兼容性問題、WAL引入的性能問題等內(nèi)容,需要...
- Sqlite
SQLite速度評測代碼
SQLite 作為一個輕量級嵌入式數(shù)據(jù)庫,還是非常好用的。雨痕極力推薦~~~~~~ ...
- Sqlite
詳解SQLite中的查詢規(guī)劃器
這篇文章主要介紹了詳解SQLite中的查詢規(guī)劃器,SQLite是一個開源的嵌入式數(shù)據(jù)庫,需要的朋友可以參考下...
- Sqlite
SQLite 入門教程三 好多約束 Constraints
在上一篇隨筆的結(jié)尾,我提到了SQLite的約束, 但是在那里我把它翻譯成了限定符,不太準確,這里先更正一下,應該翻譯成約束更貼切一點。 那么什么是...
- Sqlite
SQLite 內(nèi)存數(shù)據(jù)庫學習手冊
這篇文章主要介紹SQLite 內(nèi)存數(shù)據(jù)庫的使用方法, 需要的朋友可以參考下 ...