国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數據庫 > SQLite > 正文

SQLite速度評測代碼

2020-01-31 15:12:52
字體:
來源:轉載
供稿:網友

今天有個朋友測試 SQLite,然后得出的結論是:SQLite 效率太低,批量插入1000條記錄,居然耗時 2 分鐘!
下面是他發給我的測試代碼。我暈~~~~~~

using System.Data;
using System.Data.Common;
using System.Data.SQLite;

// 創建數據庫文件
File.Delete("test1.db3");
SQLiteConnection.CreateFile("test1.db3");

DbProviderFactory factory = SQLiteFactory.Instance;
using (DbConnection conn = factory.CreateConnection())
{
// 連接數據庫
conn.ConnectionString = "Data Source=test1.db3";
conn.Open();

// 創建數據表
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();

// 添加參數
cmd.Parameters.Add(cmd.CreateParameter());

// 開始計時
Stopwatch watch = new Stopwatch();
watch.Start();

// 連續插入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);
}

哎~~~~ 一個常識性的錯誤,我加幾行代碼 (新增代碼標記 "http:// <-------------------")。

using System.Data;
using System.Data.Common;
using System.Data.SQLite;

// 創建數據庫文件
File.Delete("test1.db3");
SQLiteConnection.CreateFile("test1.db3");

DbProviderFactory factory = SQLiteFactory.Instance;
using (DbConnection conn = factory.CreateConnection())
{
// 連接數據庫
conn.ConnectionString = "Data Source=test1.db3";
conn.Open();

// 創建數據表
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();

// 添加參數
cmd.Parameters.Add(cmd.CreateParameter());

// 開始計時
Stopwatch watch = new Stopwatch();
watch.Start();

DbTransaction trans = conn.BeginTransaction(); // <-------------------
try
{
// 連續插入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);
}

執行一下,耗時 0.2 秒。這差距是不是太大了點?

為什么只是簡單啟用了一個事務會有這么大的差距呢?很簡單,SQLite 缺省為每個操作啟動一個事務,那么原代碼 1000 次插入起碼開啟了 1000 個事務,"事務開啟 + SQL 執行 + 事務關閉" 自然耗費了大量的時間,這也是后面顯示啟動事務后為什么如此快的原因。其實這是數據庫操作的基本常識,大家要緊記,不好的代碼效率差的不是一點半點。
上一篇:SQLite優化方法

下一篇:返回列表

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 星子县| 城步| 宜春市| 佳木斯市| 民勤县| 通海县| 宣威市| 汶川县| 兴山县| 丘北县| 家居| 敦煌市| 凤翔县| 周口市| 阿勒泰市| 上饶县| 丰县| 集安市| 子长县| 呼玛县| 丁青县| 莱芜市| 尚义县| 贵溪市| 大埔县| 江达县| 甘泉县| 曲水县| 涞水县| 任丘市| 闸北区| 元氏县| 古交市| 化隆| 泾川县| 信丰县| 江津市| 滦南县| 贡山| 怀仁县| 万荣县|