摘要:SQLite 效能問題
這幾天有用到SQLite
在插入1、2千筆資料的時候,竟然要花上1、2分鐘
後來Google了一下,
才知道原來是我程式沒加 transaction 的關係
SQLite 預設每個操作都會執行 transaction
如果程式沒加 transaction,插入1000筆資料,就會執行1000次 transaction
如果程式有加 transaction,插入1000筆資料,只會執行1次 transaction
效能上會差很多
沒加 transaction -> 耗時 1 分鐘
有加 transaction -> 耗時 不到 0.1 秒
// 先刪除資料庫
File.Delete("test.db");
// 建立資料庫
SQLiteConnection.CreateFile("test.db");
using (SQLiteConnection conn = new SQLiteConnection("Data Source=test.db"))
{
// 開啟資料庫
conn.Open();
// 建立資料表
string sql = "create table test1 (id INTEGER PRIMARY KEY, number INTEGER)";
SQLiteCommand cmd = conn.CreateCommand();
cmd.Connection = conn;
cmd.CommandText = sql;
cmd.ExecuteNonQuery();
// 開始計時
Stopwatch watch = new Stopwatch();
watch.Start();
SQLiteTransaction trans = conn.BeginTransaction(); // 1
try
{
// 連續插入1000筆資料
for (int i = 0; i < 1000; i++)
{
cmd.CommandText = "insert into test1 (number) values (@a)";
cmd.Parameters.Clear();
cmd.Parameters.AddWithValue("@a", i);
cmd.ExecuteNonQuery();
}
trans.Commit(); // 2
}
catch
{
trans.Rollback(); // 3
}
// 停止計時
watch.Stop();
Console.WriteLine(watch.Elapsed);
}