Hiro的部落格

跳到主文

歡迎光臨Hiro在痞客邦的小天地

部落格全站分類:

  • 相簿
  • 部落格
  • 留言
  • 名片
  • 8月 23 週四 200710:35
  • 如何高效使用SQLite .net (C#)

SQLite 作為一個輕量級嵌入式數據庫,還是非常好用的。雨痕極力推薦
今天有個朋友測試 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);
}
哎 一個常識性的錯誤,我加幾行代碼 (新增代碼標記 "// <-------------------")。
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 執行 + 事務關閉" 自然耗費了大量的時間,
這也是後面顯示啟動事務後為什麼如此快的原因。
其實這是數據庫操作的基本常識,大家要緊記,不好的代碼效率差的不是一點半點。
[最后修改由 yuhen, 于 2006-11-18 22:09:08]
文章來源 Hyke Wants to Learn asp.net (C#)
文章標籤
全站熱搜
創作者介紹
創作者 Hiro 的頭像
Hiro

Hiro的部落格

Hiro 發表在 痞客邦 留言(0) 人氣(11,962)

  • 全站分類:
  • 個人分類:電腦和網際網路
▲top

自訂側欄

自訂側欄

個人資訊

Hiro
暱稱:
Hiro
分類:
好友:
累積中
地區:

熱門文章

  • ()揮一揮衣袖,不帶走一片雲彩
  • ()無法開啟msi副檔名的檔案
  • ()愣嚴經云:汝負我命 我還汝債 以是因緣經百千劫 常在生死
  • ()食之無味,棄之可惜
  • ()如何高效使用SQLite .net (C#)
  • ()全面深入瞭解電腦死機的原因
  • ()Windows xp 重灌前需要檢查的5個重點
  • ()享受平凡就是幸福
  • ()確立人生的目標
  • ()跳躍式思維,跳躍式的人生

文章分類

  • 圖書 (0)
  • 文章分享 (0)
  • 電腦和網際網路 (0)
  • 健康 (0)
  • 飲食 (0)
  • 心情點播 (0)
  • 朵朵小語 (0)
  • 未分類文章 (1)

最新文章

    最新留言

    動態訂閱

    文章精選

    文章搜尋

    誰來我家

    hirocat
    PIXNET Logo登入

    參觀人氣

    • 本日人氣:0
    • 累積人氣:196,745