提高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开发板上执行,经常会遇上断电或重启的情况,故没有关闭写同步。
这就是我在开发中碰到的小问题和解决方法,记录一下备用。

你可能感兴趣的:(Linux编程,sqlite,数据库,sql)