如何高效使用SQLite .net (C#)
SQLite 作为一个轻量级嵌入式数据库,还是非常好用的。
{
http://sqlite.phxsoftware.com/
}
今天有个朋友测试 SQLite,然后得出的结论是:SQLite 效率太低,批量插入1000条记录,居然耗时 2 分钟!
下面是他发给我的测试代码。我晕~~~~~~
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.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#)相关推荐
- 移动客户端中高效使用SQLite
导语 iOS 程序能从网络获取数据.少量的 KV 类型数据可以直接写文件保存在 Disk 上,App 内部通过读写接口获取数据.稍微复杂一点的数据类型,也可以将数据格式化成 JSON 或 XML 方便 ...
- 移动客户端中高效使用 SQLite
iOS 程序能从网络获取数据.少量的 KV 类型数据可以直接写文件保存在 Disk 上,App 内部通过读写接口获取数据.稍微复杂一点的数据类型,也可以将数据格式化成 JSON 或 XML 方便保存, ...
- SQLite安装、编译与应用
原文: https://www.cnblogs.com/5211314jackrose/p/5720100.html 什么是 SQLite SQLite是一款轻量级的.基于文件的嵌入式数据库,实现自包 ...
- SQLite学习手册(实例代码二)
三.高效的批量数据插入: 在给出操作步骤之前先简单说明一下批量插入的概念,以帮助大家阅读其后的示例代码.事实上,批量插入并不是什么新的概念,在其它关系型数据库的C接口API中都提供了一定的支持,只是接 ...
- (原创)sqlite封装库SmartDB1.3发布
最近终于稍微有点空对SmartDB进行升级了,SmartDB1.3比之前的版本做了简化,增强了易用性和灵活性. SmartDB对sqlite做了一层封装,屏蔽了诸多细节,使得我们使用起来很方便.在注重 ...
- 在C#中实现SQLite的事务处理
一.SQLite事务介绍 事务是针对一个或多个数据库中数据操作的基本单位,操作时可以把许多个SQLite语句组合为一组,把所有这些放在一起作为事务的一部分进行执行. 所有 SQL 命令组成一个单元. ...
- 蛙蛙推荐:蛙蛙牌云存储服务
蛙蛙推荐:蛙蛙牌云存储服务 摘要:最近云计算,云存储炒的是热火朝天,本蛙也来凑个热闹,和大家一起来DIY一个云存储服务.像live mesh目前就是个网络的OS,能把本机的东西存上去,也不是结构化的, ...
- csync2+sqlite实现数据的高效实时的增量备份
csync2+sqlite实现数据的高效实时的增量备份 前言,测试时共两台机器: 192.168.169.112 bbs1.cheabc.com 192.168.169.113 bbs2.chea ...
- 操作SQLite数据库
本文摘自: http://docs.blackberry.com/en/developers/deliverables/25108/Creating_and_deleting_SQLite_datab ...
最新文章
- C/MFC如何获得应用程序当前路径(整理)
- C语言实验——打印数字图形(JAVA)
- 用springmvc作接口时返回json数据中文乱码
- 关于JSON CSRF的一些思考
- 手机qq和电脑qq怎么同步消息_手机QQ接入华为HMS!停止运行也能接收消息
- my97DatePicker 自定义扩展方法(实现备忘录)
- 执行计划生成及查看的几种方法
- 归并排序——java
- 问题八:C++中this是干嘛用的
- JS高程5.引用类型(6)Array类型的位置方法,迭代方法,归并方法
- 如何在 Internet Explorer 中禁用和使用 ADODB.Stream 对象
- kepware datalogger
- 线性移位寄存器序列(m序列)之MATLAB实现
- 泛微oa系统什么框架_泛微OA办公系统是什么,怎么使用_使用方法_使用平台_企业服务汇...
- CPAL脚本自动化测试 ———— Test Report系列函数及使用
- 普度大学计算机科学博士,Top15普渡大学计算机博士全奖录取
- Javascript-实现全局事件总线Event Bus/ Event Emitter
- tp6 thinkswoole 使用极光curl请求时报错
- java包(java包和类)
- win10彻底关闭windows defender的两种方法