今天有個(gè)朋友測(cè)試 SQLite,然后得出的結(jié)論是:SQLite 效率太低,批量插入1000條記錄,居然耗時(shí) 2 分鐘!
下面是他發(fā)給我的測(cè)試代碼。我暈~~~~~~
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());
// 開始計(jì)時(shí)
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();
}
// 停止計(jì)時(shí)
watch.Stop();
Console.WriteLine(watch.Elapsed);
}
哎~~~~ 一個(gè)常識(shí)性的錯(cuò)誤,我加幾行代碼 (新增代碼標(biāo)記 "// <-------------------")。
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());
// 開始計(jì)時(shí)
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; // <-------------------
}
// 停止計(jì)時(shí)
watch.Stop();
Console.WriteLine(watch.Elapsed);
}
執(zhí)行一下,耗時(shí) 0.2 秒。這差距是不是太大了點(diǎn)?
為什么只是簡(jiǎn)單啟用了一個(gè)事務(wù)會(huì)有這么大的差距呢?很簡(jiǎn)單,SQLite 缺省為每個(gè)操作啟動(dòng)一個(gè)事務(wù),那么原代碼 1000 次插入起碼開啟了 1000 個(gè)事務(wù),"事務(wù)開啟 + SQL 執(zhí)行 + 事務(wù)關(guān)閉" 自然耗費(fèi)了大量的時(shí)間,這也是后面顯示啟動(dòng)事務(wù)后為什么如此快的原因。其實(shí)這是數(shù)據(jù)庫操作的基本常識(shí),大家要緊記,不好的代碼效率差的不是一點(diǎn)半點(diǎn)。
SQLite速度評(píng)測(cè)代碼
2020-06-01 17:27SQLite教程網(wǎng) Sqlite
SQLite 作為一個(gè)輕量級(jí)嵌入式數(shù)據(jù)庫,還是非常好用的。雨痕極力推薦~~~~~~
延伸 · 閱讀
- 2022-03-06QT5中使用SQLite的實(shí)現(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中重置自動(dòng)編號(hào)列的方法
這篇文章主要介紹了SQLite中重置自動(dòng)編號(hào)列的方法,本文講解了3種情況和其對(duì)應(yīng)解決方法,需要的朋友可以參考下 ...
- Sqlite
SQLite 錯(cuò)誤碼整理
這篇文章主要介紹了SQLite 錯(cuò)誤碼,方便大家在開發(fā)過程中快速解決問題 ...
- Sqlite
基于sqlite特殊字符轉(zhuǎn)義的實(shí)現(xiàn)方法
本篇文章是對(duì)sqlite特殊字符轉(zhuǎn)義的實(shí)現(xiàn)方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下 ...
- Sqlite
SQLite中的WAL機(jī)制詳細(xì)介紹
這篇文章主要介紹了SQLite中的WAL機(jī)制詳細(xì)介紹,本文講解了什么是WAL、WAL如何工作、WAL的優(yōu)點(diǎn)與缺點(diǎn)、WAL引入的兼容性問題、WAL引入的性能問題等內(nèi)容,需要...
- Sqlite
SQLite速度評(píng)測(cè)代碼
SQLite 作為一個(gè)輕量級(jí)嵌入式數(shù)據(jù)庫,還是非常好用的。雨痕極力推薦~~~~~~ ...
- Sqlite
詳解SQLite中的查詢規(guī)劃器
這篇文章主要介紹了詳解SQLite中的查詢規(guī)劃器,SQLite是一個(gè)開源的嵌入式數(shù)據(jù)庫,需要的朋友可以參考下...
- Sqlite
SQLite 入門教程三 好多約束 Constraints
在上一篇隨筆的結(jié)尾,我提到了SQLite的約束, 但是在那里我把它翻譯成了限定符,不太準(zhǔn)確,這里先更正一下,應(yīng)該翻譯成約束更貼切一點(diǎn)。 那么什么是...
- Sqlite
SQLite 內(nèi)存數(shù)據(jù)庫學(xué)習(xí)手冊(cè)
這篇文章主要介紹SQLite 內(nèi)存數(shù)據(jù)庫的使用方法, 需要的朋友可以參考下 ...