SQLite 作为一个轻量级嵌入式数据库,还是非常好用的。
{

http://sqlite.phxsoftware.com/

An open source ADO.NET provider for the SQLite database engine

}
今天有个朋友测试 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 执行 + 事务关闭" 自然耗费了大量的时间,这也是后面显示启动事务后为什么如此快的原因。其实这是数据库操作的基本常识,大家要紧记,不好的代码效率差的不是一点半点。

如何高效使用SQLite .net (C#)相关推荐

  1. 移动客户端中高效使用SQLite

    导语 iOS 程序能从网络获取数据.少量的 KV 类型数据可以直接写文件保存在 Disk 上,App 内部通过读写接口获取数据.稍微复杂一点的数据类型,也可以将数据格式化成 JSON 或 XML 方便 ...

  2. 移动客户端中高效使用 SQLite

    iOS 程序能从网络获取数据.少量的 KV 类型数据可以直接写文件保存在 Disk 上,App 内部通过读写接口获取数据.稍微复杂一点的数据类型,也可以将数据格式化成 JSON 或 XML 方便保存, ...

  3. SQLite安装、编译与应用

    原文: https://www.cnblogs.com/5211314jackrose/p/5720100.html 什么是 SQLite SQLite是一款轻量级的.基于文件的嵌入式数据库,实现自包 ...

  4. SQLite学习手册(实例代码二)

    三.高效的批量数据插入: 在给出操作步骤之前先简单说明一下批量插入的概念,以帮助大家阅读其后的示例代码.事实上,批量插入并不是什么新的概念,在其它关系型数据库的C接口API中都提供了一定的支持,只是接 ...

  5. (原创)sqlite封装库SmartDB1.3发布

    最近终于稍微有点空对SmartDB进行升级了,SmartDB1.3比之前的版本做了简化,增强了易用性和灵活性. SmartDB对sqlite做了一层封装,屏蔽了诸多细节,使得我们使用起来很方便.在注重 ...

  6. 在C#中实现SQLite的事务处理

    一.SQLite事务介绍 事务是针对一个或多个数据库中数据操作的基本单位,操作时可以把许多个SQLite语句组合为一组,把所有这些放在一起作为事务的一部分进行执行. 所有 SQL 命令组成一个单元. ...

  7. 蛙蛙推荐:蛙蛙牌云存储服务

    蛙蛙推荐:蛙蛙牌云存储服务 摘要:最近云计算,云存储炒的是热火朝天,本蛙也来凑个热闹,和大家一起来DIY一个云存储服务.像live mesh目前就是个网络的OS,能把本机的东西存上去,也不是结构化的, ...

  8. csync2+sqlite实现数据的高效实时的增量备份

    csync2+sqlite实现数据的高效实时的增量备份   前言,测试时共两台机器: 192.168.169.112 bbs1.cheabc.com 192.168.169.113 bbs2.chea ...

  9. 操作SQLite数据库

    本文摘自: http://docs.blackberry.com/en/developers/deliverables/25108/Creating_and_deleting_SQLite_datab ...

最新文章

  1. C/MFC如何获得应用程序当前路径(整理)
  2. C语言实验——打印数字图形(JAVA)
  3. 用springmvc作接口时返回json数据中文乱码
  4. 关于JSON CSRF的一些思考
  5. 手机qq和电脑qq怎么同步消息_手机QQ接入华为HMS!停止运行也能接收消息
  6. my97DatePicker 自定义扩展方法(实现备忘录)
  7. 执行计划生成及查看的几种方法
  8. 归并排序——java
  9. 问题八:C++中this是干嘛用的
  10. JS高程5.引用类型(6)Array类型的位置方法,迭代方法,归并方法
  11. 如何在 Internet Explorer 中禁用和使用 ADODB.Stream 对象
  12. kepware datalogger
  13. 线性移位寄存器序列(m序列)之MATLAB实现
  14. 泛微oa系统什么框架_泛微OA办公系统是什么,怎么使用_使用方法_使用平台_企业服务汇...
  15. CPAL脚本自动化测试 ———— Test Report系列函数及使用
  16. 普度大学计算机科学博士,Top15普渡大学计算机博士全奖录取
  17. Javascript-实现全局事件总线Event Bus/ Event Emitter
  18. tp6 thinkswoole 使用极光curl请求时报错
  19. java包(java包和类)
  20. win10彻底关闭windows defender的两种方法

热门文章

  1. 图像处理之离散傅里叶变换(DFT)
  2. Mac下配置XAMPP+EclipsePHP
  3. mysql数据库连接报2059,navicat连接MySQL报2059错误的解决方法
  4. 旗帜软件工作室Java第二阶段考核答案
  5. 使用谷歌浏览器Chrome://inspect调试 cordova 项目
  6. 关于segmentation_models的一些总结
  7. Ubuntu 18.04安装搜狗拼音输入法
  8. springboot -- 整合 poi 解析Excel 更新数据库数据
  9. windows启动项修复
  10. Mac上多种字体名称的获取