sqlite批量处理数据性能优化

最近设计到sqlite数据库批量操作的,性能很是问题。于是一番研究(站在巨人肩膀)从网上整理出来相关性能优化方向。大体分三个级别,一般第一个阶段已足够。

1、sqlite每次插入数据(每调用一次sqlite3_exec()函数)都会隐式开启一个事务,不断开启关闭会增大IO量。如果在插入数据前显式开启事务,插入后再一起提交,则会大大提高IO效率,进而加数据快插入速度。

如:

db.BeginTransaction();
try {
    for (...) {
        //db.execSQL("...", new Object[]{});
    db.insert(data);
    }
    db.CommitTransaction();
} 
catch (Exception e) { db.RollBackTransaction(); }

2、在SQLite中,数据库配置的参数都由编译指示(pragma)来实现的,而其中synchronous选项有三种可选状态,分别是full、normal、off。以及官方文档里面有详细讲到这三种参数的设置。简要说来,full写入速度最慢,但保证数据是安全的,不受断电、系统崩溃等影响,而off可以加速数据库的一些操作,但如果系统崩溃或断电,则数据库可能会损毁。SQLite3中,该选项的默认值就是full,如果我们再插入数据前将其改为off,则会提高效率。如果仅仅将SQLite当做一种临时数据库的话,完全没必要设置为full。在代码中,设置方法就是在打开数据库之后,直接插入以下语句:

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

3、虽然写同步设为off后,速度又有小幅提升,但是仍然较慢。SQLite执行SQL语句的时候,有两种方式:一种是使用前文提到的函数sqlite3_exec(),该函数直接调用包含SQL语句的字符串;另一种方法就是“执行准备”(类似于存储过程)操作,即先将SQL语句编译好,然后再一步一步(或一行一行)地执行。如果采用前者的话,就算开起了事务,SQLite仍然要对循环中每一句SQL语句进行“词法分析”和“语法分析”,这对于同时插入大量数据的操作来说,简直就是浪费时间。因此,要进一步提高插入效率的话,就应该使用后者。

“执行准备”主要分为三大步骤:

  1)调用函数

int sqlite3_prepare_v2( sqlite3 *db,  const char *zSql,  int nByte,  sqlite3_stmt **ppStmt,  const char **pzTail);

并且声明一个指向sqlite3_stmt对象的指针,该函数对参数化的SQL语句zSql进行编译,将编译后的状态存入ppStmt中。  

  2)调用函数 sqlite3_step() ,这个函数就是执行一步,如果函数返回的是SQLite_ROW则说明仍在继续执行,否则则说明已经执行完所有操作;

  3)调用函数 sqlite3_finalize(),关闭语句。

 

详情转载:http://blog.csdn.net/majiakun1/article/details/46607163

posted @ 2018-02-05 17:57  随学·笔记  阅读(1195)  评论(0编辑  收藏  举报