Android开发环境中的SQLite性能优化

2015-10-26 07:59:43
湖南邮电职业技术学院学报 2015年1期
关键词:编译器标识符事务

朱 威

(湖南强智科技发展有限公司,湖南长沙410205)

Android开发环境中的SQLite性能优化

朱威

(湖南强智科技发展有限公司,湖南长沙410205)

以Android开发环境中SQLite数据库的性能和资源占用为研究对象,剖析了SQLite的体系结构,提出且深入分析了SQLite优化方法,并向数据库中插入1000条数据来加以验证。验证结果表明,通过一次性事务可以使得性能大幅提升。

Android;SQLite;性能优化;验证测试

Google为Andriod的数据处理提供了SQLite,SQLite是一款非常流行的嵌入式数据库,它支持SQL查询,可移植性好,很容易使用。高效而且可靠的Android在运行时集成了SQLite,所以每个Android应用程序都可以使用SQLite数据库。SQLite有一个简洁的SQL接口,且以低内存占用著称。本文主要讨论在Android开发环境中如何优化SQLite的性能和资源占用。

1 SQLite

SQLite是一个开源的嵌入式数据库,它支持SQL语言,由以下几个组件组成:SQL编译器、内核、后端以及附件。SQLite架构(architecture)如图1所示。

1)编译器(Compiler)

词法分析器(Tokenizer)负责把原有字符串分割成一个个标识符,语法分析器(Parser)负责在指定的上下文中赋予标识符具体的含义。在编译器中,词法分析器和语法分析器检查SQL语法,然后把它转化为B-树(B-Tree)这种数据结构,语法分析器在把标识符组装成完整的SQL语句后,调用代码生成器(Code Generator)产生虚拟机代码,最后由虚拟机(Virtual Machine)执行SQL语句请求的工作。

图1 SQLite架构

2)接口(Interface)

接口由源文件main.c、vdbeapi.c和legacy.c组成,函数会去访问有文件作用域的数据结构,所以这些函数对分散在其他文件中的程序形成依赖。SQLite库以sqlite3为前缀命名外部符号,这些符号用来形成SQLite的API。

3)虚拟机(Virtual Machine)

架构中最核心的部分是虚拟机,虚拟机实现一个专为操作数据库文件而设计的抽象计算引擎,所以也称虚拟数据库引擎(VDBE)。代码生成器(Code Generator)生成代码并由虚拟机(Virtual Machine)来执行。虚拟机被包含在一个单独的文件vdbe.c中,它有自己的头文件,它们主要集中在数据库操作。

4)后端(Back-End)

后端由B-tree、page cache(pager)和系统调用构成。B-树(B-tree)、页缓存(pager)共同管理数据。B-树的实现位于源文件btree.c中,主要功能就是索引,便于快速找到页面之间需要的数据。而pager负责读、写和缓存这些数据,并且管理数据文件的锁定。

通过利用虚拟机和虚拟数据库引擎(VDBE),SQLite实现了多数的SQL-92标准,将SQL语句编译成在SQLite虚拟机(Virtual Machine)中执行的程序集。

2 SQLite优化

在Android开发环境中如何优化SQLite的性能和资源占用?主要通过以下两种方法。

2.1使用事务(Transaction)

一般而言,SQL语句存在全新的事务内。例如,执行一个如INSERT这样基本的数据库操作,就会放到一个新创建的事务中执行。一次只需要操作一次数据库操作时,让SQLite自己来进行事务管理当然是明智的。但如果一次有大量的操作要做时,比如循环调用INSERT添加时,这样就显得开销过大了,因为每一笔操作都要重新打开、写入,最后再关闭journal文件,这个文件是临时用来保存数据操作的中间结果。

如果明确地在一系列SQL语句前后以BEGIN TRANSACTION及END TRANSACTION这样显示地使用事务就可以避免上面的情况。程序如下所示:

使用事务有两大好处:

1)原子提交

原则提交意味着同一事务内的所有修改要么都完成要么都不做,如果某个修改失败,会自动回滚使得所有修改不生效。

2)更优性能

Sqlite默认会为每个插入、更新操作创建一个事务,并且在每次插入、更新后立即提交。如果我们显示的创建事务->执行LENGTH条语句->提交会使得这个创建事务和提交这个过程只做一次,通过这种一次性事务可以使得性能大幅提升。尤其当数据库位于sd卡时,时间上能节省两个数量级左右。

2.2使用索引(index)

如果没有在数据库使用索引,当你在一个没有排序的数据表中使用映射查询(projection query)搜索时,无可避免的要执行一个全序列查找。这种情况通常并不是什么问题,每种数据库,包括SQLite都会为数据集执行索引来降低查找时间。

索引维护着一个表中某一列或某几列的顺序,这样就可以快速定位到一组值,而不用扫遍全表。所有的索引信息会被保存在一个独立的索引表中,所以会产生额外的空间占用,不过绝对物超所值,特别是当你会在数据库中进行大量的读及搜索操作时。

SQLite会自动为每一个UNIQUE栏位创建索引,包括主键(Primary Key)栏位,另外也可以通过CREATE INDEX进行显示地创建。

使用索引有四种方式:直接创建索引和间接创建索引、普通索引和唯一性索引、单个索引和复合索引、聚簇索引和非聚簇索引。

3 验证测试

测试用例:向SQLite数据库中插入1000条数据。

测试分析:如果仅仅是执行

sqlite3_exec(db,"insert into name values'lxkxf','24';",0,0,&zErrMsg);

会重复1000次打开关闭数据库,因此应该使用“事务”。

测试方法:添加SQLite语句

rc=sqlite3_exec(db,"BEGIN;",0,0,&zErrMsg);

执行SQL语句

rc=sqlite3_exec(db,"COMMIT;",0,0,&zErrMsg);

只有这样,SQL等到COMMIT时会一次性地写入数据库,只需打开关闭1次数据库文件,大幅提高效率。

测试数据:、

1000 INSERTs

CREATE TABLE t1(a INTEGER,b INTEGER,c VARCHAR(100));

INSERT INTO t1 VALUES(1,13153,'thirteen thousand one hundred fifty three');

INSERT INTO t1 VALUES(2,75560,'seventy five thousand five hundred sixty');

...995 lines omitted

INSERT INTO t1 VALUES(998,66289,'sixty six thousand two hundred eighty nine');

INSERT INTO t1 VALUES(999,24322,'twenty four thousand three hundred twenty two');

INSERT INTO t1 VALUES(1000,94142,'ninety four thousand one hundred forty two');

SQLite 2.7.6:

13.061

SQLite 2.7.6(nosync):

4 结束语

SQLite数据库的操作都是对文件的操作,频繁访问文件相当耗时,大大降低了存取数据速度。本文提出的使用索引与事物两种方法,较好地解决了以上问题。

[1]Li W,Lu D.The Application of LBS Based on Android[M]. Network Computing and Information Security.Springer Berlin Heidelberg.2012.775-782.

[2]Vanjire S,Kanchan U,Shitole G,etal.Location Based Services on Smart Phone through the Android Application[J].provider,2014,3(1):23-27.

[3]杨明羽.Android语法范例参考大全[M].北京:电子工业出版社,2012.

[4]Kushwaha A,Kushwaha V.Location Based Services using Android Mobile Operating System[J].International Journal of Advances in Engineering&Technology,2011,1(1):14-20.

SQLite performance optimization in Android development environment

ZHU Wei
(Hunan Qiangzhi Science and Technology Development Corporation,Ltd.,Changsha,Hunan,China 410205)

Taking the characters and resource consumption of SQLite database in Android environment as the object of research,this paper analyzes the SQLite system structure and the SQLite optimization and checks with a thousand inserted data in the database.The result shows that the performance can be greatly improved by one try.

Android;SQLite;performance optimization;test and check

10.3969/j.issn.2095-7661.2015.01.010】

TP311.13

A

2095-7661(2015)01-0041-03

2015-01-06

朱威(1982-),男,湖南双峰人,湖南强智科技发展有限公司技术部经理,学士,研究方向:计算机应用技术。

猜你喜欢
编译器标识符事务
浅析5G V2X 通信应用现状及其侧链路标识符更新技术
“事物”与“事务”
基于分布式事务的门架数据处理系统设计与实现
基于底层虚拟机的标识符混淆方法
计算机应用(2022年8期)2022-08-24 06:30:36
河湖事务
基于区块链的持久标识符系统①
基于相异编译器的安全计算机平台交叉编译环境设计
数字美术馆“数字对象唯一标识符系统”建设需求浅议
中国美术馆(2016年6期)2017-01-19 08:44:24
通用NC代码编译器的设计与实现
SQLServer自治事务实现方案探析