提高Sqlite3数据库的插入、更新批量操作的执行效率

提高Sqlite3数据库的插入、更新等批量操作的执行效率

将Sqlite3数据库移植到我的Linux开发板后,在编码过程后的测试过程中发现一个问题。对数据库的表进行插入或更新操作时,效率不高,我只是测试了更新8条表中记录,居然花费了250毫秒左右。更新60条记录更是花费了6秒多的时间。效率及其低下。
查找资料后找到了原因,主要是因为Sqlite3每次执行sqlite_exec函数执行SQL语句时,都会隐式的调用一次数据库事务功能。这样你调用了多少次sqlite_exec函数,则就调用了多少次事务处理,造成效率极其低下。解决的方法也很简单,就是显式调用事务,在批量操作开始前先显示调用事务开始代码,如下:

sqlite3_exec(db, "BEGIN;", 0, 0, NULL);

然后执行批量插入或更新SQL语句。在批量操作结束后提交事务,如下:

sqlite3_exec(db, "COMMIT;", 0, 0, NULL);

这样就可以在一个事务中处理批量插入或更新操作了。实验后发现更新60条记录费时25毫秒左右。极大提高了执行效率。

整个过程C++模拟代码如下:

sqlite3* db;
string dbName = "./Test.db";
int ret = sqlite3_open(dbName.c_str(), &db);
sqlite3_exec(db, "BEGIN;", 0, 0, NULL);
char szSql[255];
char* errmsg = nullptr;
for(int i=0; i<60; i++)
{
	snprintf(szSql,255,"Update data Set col1=%d Where col2=%d", i, i);
	ret = sqlite3_exec(db, szSql, 0, 0, &errmsg);
	if(ret!=0)	//执行SQL错误时,显示错误信息
	{
		cout << errmsg << endl;
		sqlite3_free(errmsg);
	}
}
sqlite3_exec(db, "COMMIT;", 0, 0, NULL);
sqlite3_close(db);

还有一种提高执行效率的方法:关闭写同步。写同步是Sqlite3数据引擎为了在紧急时刻确保数据写入存储器,使系统崩溃或电源出问题后数据库不会损坏。Sqlite3数据库默认写同步是打开的,而且是FULL模式,关闭写同步的代码如下:

sqlite3_exec(db, "PRAGMA synchronous = OFF; ", 0,0,0);

由于我的应用是在嵌入式Linux开发板上执行,经常会遇上断电或重启的情况,故没有关闭写同步。
这就是我在开发中碰到的小问题和解决方法,记录一下备用。

  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值