Android SQLite性能分析

作为Android预置的数据库模块,对SQLite的深入理解是非常有必要的,可以从中找到一些优化的方向。这里对SQLite的性能和内存进行了一些测试分析,对比了不同操作的执行性能和内存占用的情况,粗略地列在这里算是作个小结。


1. 基本架构


先了解一下SQLite主要架构 (详见《The Definitive Guide to SQLite》), 需要关注的是Compiler和Backend两个模块。正因为有一个虚拟机的存在,所以才有了Compiled Statement的价值,因为它可以减少前置的编译时间,直接到VDBE上执行。而Backend端的Pager,则是重要数据管理者,真正决定者数据操作的性能,以及内存占用。


这里不再赘述,详细的内容还是阅读有关SQLite介绍的资料。



2. 性能


这次测试基于Sumsung i9103和Google Nexus S1进行。使用Python脚本及adb指令通过Intent操作Android应用进行数据库操作。


i. SELECT操作

首先观察到SELECT在不同记录数下的峰值分布,可见整体上有上升的趋势。正如SQLite官方说的它并不适合存储大量数据,一定要控制其中的记录数量。

另外SELECT操作性能也取决于查询的栏位个数,而@行云进一步确认和返回栏位的内容大小有关,也就是栏位的内容和多少也需要权衡。



ii. 关于事务

事务是提高SQLite操作性能的一个重要技术,特别是SQLite实现了WAL,使得事务与SELECT不会互斥,大大提高了应用的性能。参见附2。


下面是未使用事务时,三类操作的平均值:


使用了事务后,各个操作的性能大幅下降。


但是问题是事务提交的时间会变长,这个时间一是需要形成新的峰值,另外也要平分到各个操作来看:

     

所以不能贪多,事务还是要及时提交。另外注意, 虽然Compiled Statement有利于性能表现,但还不如使用事务的效果来得直接。


iii. 不同机型的操作性能

先看SELECT操作的平均值在两种机型上的表现, 可以看到i9103上的波动性比较大,而Nexsus S1则一直保持稳定:

散点图,可以观察到时间分布情况:




再看另外三个操作的表现(上下两部分false和true分别表示为未使用事务和使用事务的情况):



运用WAL可以大幅提升性能,不过它也有一个副作用。它会导致数据查询需要进行两次,可以理解为一次在db文件,一次在wal文件。具体原因参见<<The Definitive Guide to SQLite>>最后一章。WAL是满1000Pages时才会合并到主数据库里,这个时机称为checking point, 可以进行配置。按默认的Page Size:1024计算,也就是当WAL文件接近1M时,进行检查。如果没有活动的事务使用这些pages,就会提交。而WAL的大小,对SELECT的影响表现不同。


下面是WAL对查询性能峰值影响的测试数据(i9103上测试),图中的true,false表示是否有WAL文件存在。


 *整体的平均值相差在1ms,但峰值的才是真正值得注意的。


为了避免WAL过大,可以选择调用SQLiteDatabase::disableWriteAheadLogging()强制合并到主数据库文件,这个调用会异步在SQLite内部执行,不会明显阻塞用户的线程。


*另外,SQLiteDatabase::query()只是对SQLiteDatabase::rawQuery()的封装,多了一个字串组装的过程,反而不如直接使用SQLiteDatabase::rawQuery()。



3. 内存 


SQLite以Page为单位存储数据,默认一个Page有1024字节,然后通过B- Tree组织起来(Table使用B+ Tree组织):



Lookaside则是SQLite应用的内存管理的技术,优化了内存的使用效率,主要思想是先分配一整块内存, 分成若干个slots,然后SQLite再按需使用。这和许多小内存分配器的思想是一样的。详见附1。


再解释一下Page Cache Overflow, 主要是在一个Page中的记录的数据无法刚好放在一个Page内,还要使用额外的另一个Page空间, 这就是Overflow Page。

     


Android还有个万能dumpsys, 使用dumpsys meminfo可以查看到一个进程的SQLite使用的内存信息。如:

SQL

                heap:      265          MEMORY_USED:      265

  PAGECACHE_OVERFLOW:       73          MALLOC_SIZE:       46

 

 DATABASES

      pgsz     dbsz   Lookaside(b)          cache  Dbname

         4       60             17      199/114/1  webviewCache.db

                                          1/541/1  (pooled # 1) webviewCache.db


   . cache的三个值分别是:

        Page Cache的命中次数、未命中次数,以及Page Cache个数。可以在Android源码中的SQLiteDebug.java以及ActivityThread.java找到细节的内容。

   . page size, db size的单位是KBytes, Lookaside(b)是指使用多少个Lookaside的slots。

   . 对于Heap和Overflow Pages,SQLiteDatabase的内存回收可能没有那么及时,可以调用SQLiteDatabase::releaseMemory()进行主动释放。


*使用SQLite的PRAGMA可以直接获取一些通过SQLiteDatabase获取不到信息,当然如果SQLite不支持,也会抛异常出来,详见附4。


转载请注明出处: http://blog.csdn.net/horkychen  SQLite是一个非常精致的系统,很值得研究学习。


参考

  1. SQLite Dynamic Memory Allocation

  2. Write-Ahead Logging 或 SQLite的WAL机制

  3. The Definitive Guide to SQLite( SQLite权威指南, 两处关于架构和Overflow page的截图来于此书.)

  4. PRAGMA Statement

  5. 官方文档

  6. NEC关于Android系统上存储器操作性能的研究报告 (里面有讲述SQLite因为其随机性访问的机制而在不同文件系统上的性能差异)

  7. Android开发中的SQLite优化





  • 5
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
### 回答1: Android SQLiteStudio是一个Android平台上的数据库管理工具,主要用于管理和操作SQLite数据库。 首先,SQLite是一个轻型的数据库引擎,它被广泛应用于Android平台上的应用程序开发。而SQLiteStudio则是一个用于管理SQLite数据库的可视化工具。通过SQLiteStudio,开发者可以方便地创建、修改和维护数据库表结构以及数据记录。 在Android应用开发过程中,使用SQLiteStudio可以帮助开发者更好地管理应用程序的数据库。例如,开发者可以通过SQLiteStudio创建数据库表,定义表的字段以及字段的数据类型。创建完毕后,开发者可以使用SQLiteStudio插入、更新和删除数据记录,还可以执行查询操作以检索数据库中的数据。 另外,SQLiteStudio也提供了一些高级功能,如索引、触发器和视图的管理。通过这些功能,开发者可以优化数据库的性能和查询效率,提高应用程序的响应速度和用户体验。 总之,Android SQLiteStudio是Android平台上的一款实用工具,它可以帮助开发者更好地管理和操作SQLite数据库。通过SQLiteStudio,开发者可以轻松创建、修改和维护数据库表结构以及数据记录,同时还可以使用高级功能优化数据库性能。 ### 回答2: Android SQLiteStudio是一个用于管理和操作SQLite数据库的开源软件。它提供了一个直观的图形用户界面(GUI),使用户能够轻松地创建、编辑和删除数据库、表格和数据。 使用Android SQLiteStudio,您可以执行各种数据库操作,如创建新数据库、导入和导出数据、编辑表格和数据行等。该软件提供了一个简单而强大的用户界面,使您能够轻松地进行这些操作,而无需编写复杂的SQL语句。 此外,Android SQLiteStudio还具有数据查看和过滤功能,以帮助用户更好地理解和分析数据库中的数据。您可以轻松地浏览和搜索数据库中的数据,并使用过滤器来查找特定的数据行。 Android SQLiteStudio还提供了一个强大的查询编辑器,让用户可以编写和执行复杂的SQL查询。您可以自定义查询的条件、排序和列,并立即看到结果。该软件还提供了一些常用的查询功能,如联接、聚合和分组。 总的来说,Android SQLiteStudio是一个简单而强大的工具,用于管理和操作SQLite数据库。它提供了一个直观的用户界面,使用户能够轻松地进行各种数据库操作,如创建、编辑和删除数据库、表格和数据。它还具有数据查看和查询编辑器的功能,使用户能够更好地理解和分析数据库中的数据。 ### 回答3: Android SQLitestudio是一个功能强大的数据库管理工具,用于管理和操作SQLite数据库。它可以在Android设备上直接运行,提供了简单直观的界面和多种功能,使得开发者可以更轻松地管理和查询数据库。 首先,SQLitestudio提供了一个直观的图形界面,使得用户可以通过简单的点击和拖动操作来管理数据库。用户可以轻松地创建、编辑和删除表格、字段和索引,而不需要编写复杂的SQL语句。此外,SQLitestudio还提供了丰富的模板和向导,帮助用户快速创建数据库结构。 其次,SQLitestudio具有强大的查询功能,允许用户轻松执行各种复杂的SQL查询。用户可以使用SQL编辑器编写和调试SQL语句,然后通过查询结果窗口查看查询结果。此外,SQLitestudio还提供了查询构建器,帮助用户快速构建常见的查询语句,减少了错误和繁琐的工作。 此外,SQLitestudio还提供了数据导入和导出功能,用户可以将数据从其他数据库导入到SQLite数据库中,或者将SQLite数据库导出到其他格式(如CSV、JSON等)。这种灵活性和互操作性使得开发者可以更好地与其他数据库和数据源进行集成。 最后,SQLitestudio还支持批量操作和数据编辑。用户可以一次性插入、更新或删除多行数据,而不需要手动编写和执行多个SQL语句。此外,SQLitestudio还提供了直接编辑数据的功能,用户可以直接在表格中编辑和更新数据,而不需要编写和执行SQL语句。 综上所述,Android SQLitestudio是一个强大的数据库管理工具,提供了直观的界面、丰富的功能和强大的查询能力。它方便了开发者管理和操作SQLite数据库,在Android开发中起到了重要的作用。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值