| 今天有个朋友测试 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 执行 + 事务关闭" 自然耗费了大量的时间,这也是后面显示启动事务后为什么如此快的原因。其实这是数据库操作的基本常识,大家要紧记,不好的代码效率差的不是一点半点。   本文出自:亿恩科技【www.enkj.com】
 
 
		服务器租用/服务器托管中国五强!虚拟主机域名注册顶级提供商!15年品质保障!--亿恩科技[ENKJ.COM] |