(^o^)/~完美 发表于 2016-11-30 07:43:48

android上SQLite性能优化的问题

1.利用android提高的的insert,query,update,deleteAPI与execSql,rawQuery函数执行原生的插入,查询,更新,删除语句操作花费时间的对比结果
    在相同的环境(adnroid4.0)和相同的机器下执行相同的动作,记录条数也一样的情况下的对比,多次验证的如下:
    (1)如果批量执行的记录数在1000条,则Android SqliteDatabase提供的insert,query,update,delete函数和直接写SQL文的execSql,rawQuery的效率差不多,几乎一样。所以使用哪种方式都可以,不会影响到执行效率。
    (2)如果批量执行的记录数在10万条,则会存在差别。在某台手机上SqliteDatabase提供的insert执行插入操作耗时45秒,要比execSql插入35秒慢10秒左右。
    可见在数据库大的情况下,还是有差别的。execSql省去了拼接sql语句的步骤,要比SqliteDatabase提供的insert,query,update,delete等函数效率高。当数据库越大,差别也越大。
 
     2.Sqlite数据库批量操作效率的问题
     应用程序初始化时需要批量的向sqlite中插入大量数据,单独的使用for+Insert方法导致应用响应缓慢, 因为  SQLite的数据库本质上来讲就是一个磁盘上的文件,所以一切的数据库操作其实都会转化为对文件的操作,而频繁的文件操作将会是一个很耗时的过程,会极大地影响数据库存取的速度。sqlite插入数据的时候默认一条语句就是一个事务,有多少条数据就有多少次磁盘操作。初始5000条记录也就是要5000次读写磁盘操作, 将会重复的打开关闭数据库文件5000次,所以速度当然会很慢。而且不能保证所有数据都能同时插入。
  解决方法:
  添加事务处理,把5000条插入作为一个事务
  我们使用SQLite的事务进行控制:
          db.beginTransaction();  //手动设置开始事务
          try{
              //批量处理操作
              for(Collection c:colls){
                  insert(db, c);
              }
              db.setTransactionSuccessful(); //设置事务处理成功,不设置会自动回滚不提交。
  //在setTransactionSuccessful和endTransaction之间不进行任何数据库操作 
             }catch(Exception e){
                 MyLog.printStackTraceString(e);
             }finally{
                 db.endTransaction(); //处理完成
             }
    这样SQLite将把全部要执行的SQL语句先缓存在内存当中,然后等到COMMIT的时候一次性的写入数据库,这样数据库文件只被打开关闭了一次,效率自然大大的提高
 
 
页: [1]
查看完整版本: android上SQLite性能优化的问题