[C#]SQLite执行效率优化结论
一、如要使用SQLite,可以从Visual Studio中的“程序包管理器控制台”输入以下命令完成安装:
PM> Install-Package System.Data.SQLite.Core
SQLite则会安装到项目中,支持32位或64位,如下图所示:


二、新建一个SQLite数据库,名称命名为Test.db,其表名称及列定义如下:

三、新建一个控制台应用的解决方案,并输入以下代码,看看SQLite的执行时间:
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SQLite;
using System.Diagnostics; namespace ConsoleApp
{
class Program
{
static void Main(string[] args)
{
SQLiteConnection connection = Run(() => new SQLiteConnection("Data Source = Test.db"), "连接对象初始化");
Run(() => connection.Open(), "打开连接");
SQLiteCommand command = Run(() => new SQLiteCommand(connection), "命令对象初始化");
Run(() =>
{
command.CommandText = $"DELETE FROM Info;VACUUM;UPDATE sqlite_sequence SET seq ='0' where name ='Info';";
command.ExecuteNonQuery();
}, "执行DELETE命令及收缩数据库");
Run(() =>
{
for (int i = ; i < ; i++)
{
command.CommandText = $"INSERT INTO Info(Name, Age) VALUES ('A{i:000}','{i}')";
command.ExecuteNonQuery();
}
command.ExecuteScalar();
}, "[---使用事务---]事务执行INSERT命令");
List<Test> list1 = Run(() =>
{
command.CommandText = $"SELECT * FROM Info";
List<Test> tests = new List<Test>();
SQLiteDataReader reader = command.ExecuteReader();
while (reader.Read())
{
Test t = new Test
{
ID = (long)reader[],
Name = (string)reader[],
Age = (long)reader[]
};
tests.Add(t);
}
reader.Close();
return tests;
}, "[---不使用事务---]使用ExecuteReader方式执行SELECT命令");
DataTable table1 = Run(() =>
{
command.CommandText = $"SELECT * FROM Info";
SQLiteDataAdapter adapter = new SQLiteDataAdapter(command);
DataTable _table = new DataTable();
adapter.Fill(_table);
return _table;
}, "[---不使用事务---]使用Fill Table方式执行SELECT命令"); Run(() =>
{
command.CommandText = $"DELETE FROM Info;VACUUM;UPDATE sqlite_sequence SET seq ='0' where name ='Info';";
command.ExecuteNonQuery();
}, "执行DELETE命令及收缩数据库");
SQLiteTransaction transaction = Run(() => connection.BeginTransaction(), "开始事务");
Run(() =>
{
for (int i = ; i < ; i++)
{
command.CommandText = $"INSERT INTO Info(Name, Age) VALUES ('A{i:000}','{i}')";
command.ExecuteNonQuery();
}
var result = command.ExecuteScalar();
}, "[---使用事务---]执行INSERT命令");
List<Test> list2 = Run(() =>
{
command.CommandText = $"SELECT * FROM Info";
List<Test> tests = new List<Test>();
SQLiteDataReader reader = command.ExecuteReader();
while (reader.Read())
{
Test t = new Test
{
ID = (long)reader[],
Name = (string)reader[],
Age = (long)reader[]
};
tests.Add(t);
}
reader.Close();
return tests;
}, "[---使用事务---]使用ExecuteReader方式执行SELECT命令");
DataTable table2 = Run(() =>
{
command.CommandText = $"SELECT * FROM Info";
SQLiteDataAdapter adapter = new SQLiteDataAdapter(command);
DataTable _table = new DataTable();
adapter.Fill(_table);
return _table;
}, "[---使用事务---]使用Fill Table方式执行SELECT命令");
Run(() => transaction.Commit(), "提交事务");
Run(() => connection.Close(), "关闭连接");
Console.ReadKey();
} public static void Run(Action action,string description)
{
Stopwatch sw = Stopwatch.StartNew();
action();
Console.WriteLine($"--> {description}: {sw.ElapsedMilliseconds}ms");
} public static T Run<T>(Func<T> func, string description)
{
Stopwatch sw = Stopwatch.StartNew();
T result = func();
Console.WriteLine($"--> {description}: {sw.ElapsedMilliseconds}ms");
return result;
}
} class Test
{
public long ID { set; get; }
public string Name { set; get; }
public long Age { set; get; }
}
}
程序运行结果如下:

四、根据以上的程序运行结果,可以得出以下结论:
1)SQLiteConnection对象初始化、打开及关闭,其花费时间约为109ms,因此,最好不要频繁地将该对象初始化、打开与关闭,这与SQL Server不一样,在这里建议使用单例模式来初始化SQLiteConnection对象;
在网上查找了SQLiteHelper帮助类,但很多都是没执行一次SQL语句,都是使用这样的流程:初始化连接对象->打开连接对象->执行命令->关闭连接对象,如下的代码所示:
public int ExecuteNonQuery(string sql, params SQLiteParameter[] parameters)
{
int affectedRows = ;
using (SQLiteConnection connection = new SQLiteConnection(connectionString))
{
using (SQLiteCommand command = new SQLiteCommand(connection))
{
try
{
connection.Open();
command.CommandText = sql;
if (parameters.Length != )
{
command.Parameters.AddRange(parameters);
}
affectedRows = command.ExecuteNonQuery();
}
catch (Exception) { throw; }
}
}
return affectedRows;
}
根据以上的结论,如果要求执行时间比较快的话,这样的编写代码方式实在行不通。
2)使用ExecuteReader方式比使用Adapter Fill Table方式快一点点,但这不是绝对的,这取决于编写的代码;
3)无论是执行插入或查询操作,使用事务比不使用事务快,尤其是在批量插入操作时,减少得时间非常明显;
比如在不使用事务的情况下插入3000条记录,执行所花费的时间为17.252s,而使用事务,执行时间只用了0.057s,效果非常明显,而SQL Server不存在这样的问题。
4)不能每次执行一条SQL语句前开始事务并在SQL语句执行之后提交事务,这样的执行效率同样是很慢,最好的情况下,是在开始事务后批量执行SQL语句,再提交事务,这样的效率是最高的。
[C#]SQLite执行效率优化结论的更多相关文章
- 进阶系列一【绝对干货】---SQL语句执行效率优化
1.尽量适用联接查询来取代子查询 2.如果要用子查询,用EXISTS替代IN.用NOT EXISTS替代NOT IN,因为EXISTS引入的子查询只是测试是否存在符合子查询中指定条件的行,效率较高.无 ...
- .NET代码执行效率优化
NET性能优化方面的总结 从2004年底开始接触C#到现在也有2年多的时间了,因为有C++方面的基础,对于C#,我习惯于与C++对比.现在总结一些.NET方面的性能优化方面的经验,算是对这两年多的.N ...
- SQL 存储过程 执行效率优化提升 (显示估计)
在sql server 查询区 通过执行 "显示估计的执行计划" ,可以给出 存储过程 缺少索引的提示,并自动生成建立相应 索引 的代码 显示估计的执行计划 执行结果提示: 哦,算 ...
- SQL Server SQL性能优化之--通过拆分SQL提高执行效率,以及性能高低背后的原因
复杂SQL拆分优化 拆分SQL是性能优化一种非常有效的方法之一, 具体就是将复杂的SQL按照一定的逻辑逐步分解成简单的SQL,借助临时表,最后执行一个等价的逻辑,已达到高效执行的目的 一直想写一遍通过 ...
- SQL Server 并行操作优化,避免并行操作被抑制而影响SQL的执行效率
为什么我也要说SQL Server的并行: 这几天园子里写关于SQL Server并行的文章很多,不管怎么样,都让人对并行操作有了更深刻的认识. 我想说的是:尽管并行操作可能(并不是一定)存在这样或者 ...
- 优化javaScript代码,提高执行效率
今天看完书,总结了一下可以如何优化 JavaScript . 1.合并js文件 为优化性能,可以把多个js文件(css文件也可以)合并成极少数大文件.跟十个5k的js文件相比,合并成一个50k的文件更 ...
- mysql优化(三)–explain分析sql语句执行效率
mysql优化(三)–explain分析sql语句执行效率 mushu 发布于 11个月前 (06-04) 分类:Mysql 阅读(651) 评论(0) Explain命令在解决数据库性能上是第一推荐 ...
- 怎么优化JAVA程序的执行效率和性能?
现在java程序已经够快的了,不过有时写出了的程序效率就不怎么样,很多细节值得我们注意,比如使用StringBuffer或者StringBuilder来拼接或者操作字符串就比直接使用String效率高 ...
- Linq的执行效率及优化
描述:项目中使用了linq,发现写的顺序不一样最后的结果也不一样,效率也不一样. Linq的执行效率对比 List<int> source = new List<int>(); ...
随机推荐
- node中__dirname、__filename、process.cwd()、process.chdir()表示的路径
直接上结论:__dirname 表示当前文件所在的目录的绝对路径__filename 表示当前文件的绝对路径module.filename ==== __filename 等价process.cwd( ...
- DirectX SDK (June 2010)安装错误S1023,解决方法
转自:http://hi.baidu.com/rootcat/item/6730f15f85e2c1958c12ed81 DirectX SDK (June 2010)安装错误S1023,解决方法 导 ...
- Spark性能优化(基于Spark 1.x)
Task优化: 1.慢任务的性能优化:可以考虑减少每个Partition处理的数据量,同时建议开启spark.speculation(慢任务推导,当检测的慢任务时,会同步开启相同的新任务,谁先完 ...
- 1.Spring MVC详解
目录 1.SpringMVC 详细介绍 2.SpringMVC 处理请求流程 3.配置前端控制器 4.配置处理器适配器 5.编写 Handler 6.配置处理器映射器 7.配置视图解析器 8.Disp ...
- 出现error: stray ‘\357’ in program的根源
分类: 编程语言/ C#/ 文章 这次又遇到这个这种问题,想找到它的根源.找到一个表格: The characters at a glance Here are all the printable c ...
- parallels Desktop解决无法压缩硬盘的问题
使用pd12新建的win7虚拟机仅仅使用了四十个G,但在本地硬盘中的体现却是占用了一百左右:尝试压缩提示: 无法编辑硬盘属性,因为该硬盘有一个或多个快照. 该硬盘属于某一带有一个或多个快照的虚拟机.请 ...
- SQLite基本操作-----IOS(如有雷同,纯属巧合)
一.常用方法 sqlite3 *db, 数据库句柄,跟文件句柄FILE很类似 sqlite3_stmt *stmt, 这个相当于ODBC的Command对象,用于保存编译好 ...
- Beta冲刺! Day3 - 砍柴
Beta冲刺! Day3 - 砍柴 今日已完成 晨瑶:追查进度:确定推荐算法 昭锡:查看Note模块的处理逻辑.查找主页UI的解决方案 永盛:数据库的大量整合和新建,备份和还原:完成部分新的逻辑 立强 ...
- 第一章 Bootstrasp起步
模板如下: <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf ...
- Cannot uninstall 'pyserial'. It is a distutils installed project and thus we cannot a ccurately determine which files belong to it which would lead to only a partial uninstall. 解决方法
最近再升级 pyserial模块时,采用 pip install --upgrade pyserial,待模块下载完成准备卸载原版本时 提示:“Cannot uninstall 'pyserial'. ...