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

文章链接

评论可见,请评论后查看内容,谢谢!!!评论后请刷新页面。