今天有个朋友测试 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速度评测代码
2020-06-01 17:27SQLite教程网 Sqlite
SQLite 作为一个轻量级嵌入式数据库,还是非常好用的。雨痕极力推荐~~~~~~
延伸 · 阅读
- 2022-03-06QT5中使用SQLite的实现方法
- 2022-03-05C# SQLite数据库入门使用说明
- 2022-02-28Python 操作SQLite数据库详情
- 2022-02-24C# SQLite执行效率的优化教程
- 2022-01-20SQLite在C#中的安装与操作技巧
- 2022-01-19CentOS下更新SQLite版本
- Sqlite
SQLite学习手册(SQLite在线备份)
在SQLite中提供了一组用于在线数据库备份的APIs函数(C接口),可以很好的解决上述方法存在的不足。通过该组函数,可以将源数据库中的内容拷贝到另一个数...
- Sqlite
SQLite3中自增主键相关知识总结
这篇文章主要介绍了SQLite3中自增主键相关知识总结,清零的方法、INTEGER PRIMARY KEY AUTOINCREMENT和rowid的使用等,需要的朋友可以参考下 ...
- Sqlite
SQLite教程(十一):临时文件
这篇文章主要介绍了SQLite教程(十一):临时文件,本文讲解了七种临时文件并对它们一一具体说明,并相关的编译时参数和指令、其它优化策略等内容,需要...
- Sqlite
SQLite3 命令行操作指南
这篇文章主要为大家介绍了SQLite3 命令行操作的一些帮助,需要的朋友可以参考下 ...
- Sqlite
SQLite教程(九):在线备份
这篇文章主要介绍了SQLite教程(九):在线备份,本文讲解了常用备份方法、在线备份APIs简介、高级应用技巧等内容,需要的朋友可以参考下 ...
- Sqlite
基于sqlite特殊字符转义的实现方法
本篇文章是对sqlite特殊字符转义的实现方法进行了详细的分析介绍,需要的朋友参考下 ...
- Sqlite
SQLite数据库管理系统-我所认识的数据库引擎
SQLite是一款轻量级的、被设计用于嵌入式系统的关联式数据库管理系统,SQLite 是一个实现自我依赖、纯客户端、零配置且支持事务的数据库引擎 ...
- Sqlite
初识SQLITE3数据库
本文主要讲诉Sqlite数据库的一些基本概念以及SQLite的优势,需要的朋友可以参考下 ...