C#,sqlite批量操作速度优化

2013年11月26日 21:53:48

阅读数:2848

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

来源:https://blog.csdn.net/xiaohu_2012/article/details/16973025

文章标签:  事务 优化 sqlite 速度 批量

C#,sqlite批量操作速度优化(插入1000条2分钟变0.2秒)相关推荐

  1. java mysql 快速插入1000w条数据_教你88秒插入1000万条数据到mysql数据库表

    我用到的数据库为,mysql数据库5.7版本的 1.首先自己准备好数据库表 其实我在插入1000万条数据的时候遇到了一些问题,现在先来解决他们,一开始我插入100万条数据时候报错,控制台的信息如下: ...

  2. 向MySQL创建的表中插入1000条测试数据

    create procedure xunhuancharu() begin DECLARE i INT DEFAULT 1; WHILE (i <= 1000) DO INSERT INTO t ...

  3. MySQL 批量插入数据,单次插入多少条数据效率最高

    文章目录 一.前言 二.批量插入前准备 1.插入到数据表的字段 2.计算一行字段占用的空间 3.在数据里做插入操作的时候,整体时间的分配 三.批量插入数据测试 1.SQL语句的大小限制 2.查看服务器 ...

  4. SQLite批量插入效率

    一.循环单条数据插入 SQLite插入单条数据效率并不高,原因是: Because it does not have a central server to coordinate access, SQ ...

  5. Swift 中使用 SQLite——批量更新(事务处理)

    本文是Swift 中使用 SQLite系列的收官之作,介绍一下在数据库中的批量更新. 事务 在准备做大规模数据操作前,首先开启一个事务,保存操作前的数据库的状态 开始数据操作 如果数据操作成功,提交事 ...

  6. php读sqlite速度,SQLite数据库操作速度和性能评测

    SQLite 作为一个轻量级嵌入式数据库,还是非常好用的.雨痕极力推荐~~~~~~ 今天有个朋友测试 SQLite,然后得出的结论是:SQLite 效率太低,批量插入1000条记录,居然耗时 2 分钟 ...

  7. 教你急速快速批量插入1000万条数据到mysql数据库表面试题

    急速快速批量插入1000万条数据到mysql数据库表面试题 教你急速快速批量插入1000万条数据到mysql数据库表&面试题 我用到的数据库为,mysql数据库5.7版本的 1.首先自己准备好 ...

  8. 批量往mysql里面插入1000万条数据_绝对干货,教你4分钟插入1000万条数据到mysql数据库表,快快进来...

    我用到的数据库为,mysql数据库5.7版本的 1.首先自己准备好数据库表 其实我在插入1000万条数据的时候遇到了一些问题,现在先来解决他们,一开始我插入100万条数据时候报错,控制台的信息如下: ...

  9. android sqlite批量操作,Android: SQLite批量插入数据的最佳实践

    大家都知道,Android里数据库用的是SQLite.在实际开发过程中,我们有时候会遇到批量插入数据的场景.这篇文章给大家分享一个小技巧,让批量插入数据达到最快的目的. 首先,我先创建一个Table, ...

最新文章

  1. MongoDB数据库安装与连接
  2. 南京工业大学浦江学院计算机学院,招生季 叮~让你爱上南京工业大学浦江学院的若干个理由...
  3. Java千百问局部变量、类变量、实例变量有什么区别
  4. python app逆向_python之app逆向破解data参数中的PassWord DES加密无填充
  5. DP动态规划【专辑@AbandonZHANG】
  6. 笔记本键盘字母变数字解决方法
  7. 搭建gos_快速浏览gOS –但不要称其为Google
  8. java中import是什么意思_java中import关键字是什么意思
  9. PCB板上的字母代表哪些元器件?一文看全!
  10. 计算机文化基础课程实验,计算机文化基础课程实验.doc
  11. domoticz 使用esp8266通过mqtt控制灯开关
  12. 重装系统进入PE的快捷键大全
  13. wps时间戳转换成日期
  14. SpeechSynthesisUtterance文字转语音播报
  15. RISC-V 开发工具链的使用
  16. css(六)--css高级技巧
  17. 基于Java的服务器应用监控系统设计与实现
  18. 隐私泄露无孔不入?扫地机器人已成新型“窃听器”
  19. vue ts项目同时引入ant-design和element-ui,ts报错不能编译打包失败
  20. 京津冀计算机考研院校2021与2022招生人数对比

热门文章

  1. 详解4D毫米波雷达数据集(VOD)Multi-class Road User Detection with 3+1D Radar in the View-of-Delft Dataset
  2. 2018-8-10-使用-ahk-让普通键盘变为Dvorak键盘
  3. JS压缩方法(使用uglify工具在本地压缩)及批量压缩
  4. proxmox 宿主机添加硬盘
  5. Linux 下利用netem模拟广域网特性
  6. sql between取时间范围
  7. 电路仿真软件详谈(27),基于电路仿真软件proteus的实时时钟仿真
  8. Git的作用和常用git命令
  9. Lucene查询语法
  10. 2015年06月09日