原文:

http://www.cnblogs.com/yelsea/archive/2007/06/21/792314.html

本人在vs2008中使用的结果

1.没添加那个事务那段代码的情况

 

  1. using System; 
  2. using System.Collections.Generic; 
  3. using System.Linq; 
  4. using System.Text; 
  5. using System.Data; 
  6. using System.Data.Common; 
  7. using System.Data.SQLite; 
  8. using System.Diagnostics; 
  9.  
  10. namespace CApp 
  11.     class Program 
  12.     { 
  13.         static void Main(string[] args) 
  14.         { 
  15.             System.IO.File.Delete("test.db"); 
  16.             SQLiteConnection.CreateFile("test.db"); 
  17.             DbProviderFactory factory = SQLiteFactory.Instance; 
  18.             using (DbConnection conn = factory.CreateConnection()) 
  19.             { 
  20.                 // 连接数据库 
  21.                 conn.ConnectionString = "Data Source=test.db"
  22.                 conn.Open(); 
  23.  
  24.                 // 创建数据表 
  25.                 string sql = "create table [test1] ([id] INTEGER PRIMARY KEY, [s] TEXT COLLATE NOCASE)"
  26.                 DbCommand cmd = conn.CreateCommand(); 
  27.                 cmd.Connection = conn; 
  28.                 cmd.CommandText = sql; 
  29.                 cmd.ExecuteNonQuery(); 
  30.  
  31.                 // 添加参数 
  32.                 cmd.Parameters.Add(cmd.CreateParameter()); 
  33.  
  34.                 // 开始计时 
  35.                 Stopwatch watch = new Stopwatch(); 
  36.                 watch.Start(); 
  37.  
  38.                 //DbTransaction trans = conn.BeginTransaction(); 
  39.                 //try 
  40.                 //{ 
  41.                     // 连续插入1000条记录 
  42.                     for (int i = 0; i < 1000; i++) 
  43.                     { 
  44.                         cmd.CommandText = "insert into [test1] ([s]) values (?)"
  45.                         cmd.Parameters[0].Value = i.ToString(); 
  46.  
  47.                         cmd.ExecuteNonQuery(); 
  48.                     } 
  49.                     //trans.Commit(); 
  50.                 //} 
  51.                 //catch 
  52.                 //{ 
  53.                 //    trans.Rollback(); 
  54.                 //    throw; 
  55.                 //} 
  56.  
  57.                 // 停止计时 
  58.                 watch.Stop(); 
  59.                 Console.WriteLine(watch.Elapsed); 
  60.                 Console.Read(); 
  61.             } 
  62.         } 
  63.     } 

运行结果用时:00:01:11.5081320,用了1分11秒多。

2.修改了代码后

 

  1. using System; 
  2. using System.Collections.Generic; 
  3. using System.Linq; 
  4. using System.Text; 
  5. using System.Data; 
  6. using System.Data.Common; 
  7. using System.Data.SQLite; 
  8. using System.Diagnostics; 
  9.  
  10. namespace CApp 
  11.     class Program 
  12.     { 
  13.         static void Main(string[] args) 
  14.         { 
  15.             System.IO.File.Delete("test.db"); 
  16.             SQLiteConnection.CreateFile("test.db"); 
  17.             DbProviderFactory factory = SQLiteFactory.Instance; 
  18.             using (DbConnection conn = factory.CreateConnection()) 
  19.             { 
  20.                 // 连接数据库 
  21.                 conn.ConnectionString = "Data Source=test.db"
  22.                 conn.Open(); 
  23.  
  24.                 // 创建数据表 
  25.                 string sql = "create table [test1] ([id] INTEGER PRIMARY KEY, [s] TEXT COLLATE NOCASE)"
  26.                 DbCommand cmd = conn.CreateCommand(); 
  27.                 cmd.Connection = conn; 
  28.                 cmd.CommandText = sql; 
  29.                 cmd.ExecuteNonQuery(); 
  30.  
  31.                 // 添加参数 
  32.                 cmd.Parameters.Add(cmd.CreateParameter()); 
  33.  
  34.                 // 开始计时 
  35.                 Stopwatch watch = new Stopwatch(); 
  36.                 watch.Start(); 
  37.  
  38.                 DbTransaction trans = conn.BeginTransaction(); 
  39.                 try 
  40.                 { 
  41.                     // 连续插入1000条记录 
  42.                     for (int i = 0; i < 1000; i++) 
  43.                     { 
  44.                         cmd.CommandText = "insert into [test1] ([s]) values (?)"
  45.                         cmd.Parameters[0].Value = i.ToString(); 
  46.  
  47.                         cmd.ExecuteNonQuery(); 
  48.                     } 
  49.                     trans.Commit(); 
  50.                 } 
  51.                 catch 
  52.                 { 
  53.                     trans.Rollback(); 
  54.                     throw
  55.                 } 
  56.  
  57.                 // 停止计时 
  58.                 watch.Stop(); 
  59.                 Console.WriteLine(watch.Elapsed); 
  60.                 Console.Read(); 
  61.             } 
  62.         } 
  63.     } 

本人机器运行结果00:00:00.0724826也就是0.07秒

机器配置:

Intel 酷睿2双核 E8400 

2G内存

 

为什么只是简单启用了一个事务会有这么大的差距呢?很简单,SQLite 缺省为每个操作启动一个事务,那么原代码 1000 次插入起码开启了 1000 个事务,"事务开启 + SQL 执行 + 事务关闭" 自然耗费了大量的时间,这也是后面显示启动事务后为什么如此快的原因。其实这是数据库操作的基本常识,大家要紧记,不好的代码效率差的不是一点半点。

 

感谢原作者。