android sqlite 对sqlite有哪些优化
1个回答
推荐于2016-10-03 · 知道合伙人数码行家
huanglenzhi
知道合伙人数码行家
向TA提问 私信TA
知道合伙人数码行家
采纳数:117538
获赞数:517184
长期从事计算机组装,维护,网络组建及管理。对计算机硬件、操作系统安装、典型网络设备具有详细认知。
向TA提问 私信TA
关注
展开全部
关于 SQLite 的优化,首先是能用SQL语句的,就不要单笔操作,
Cursor 就更是能不用就不用。比如成批的
DELETE/UPDATE ,将条件组装到
SQL 语句,会比使用 CURSOR
一条条的查再删效率要高很多(
若干年前就曾使用存储过程代替单笔操作,将一次批量计算时间从一晚上缩到了一小时以内
)。其次是对操作的优化:对于 INSERT/UPDATE
操作较多时使用事务,如果SELECT操作较多时,使用索引。
结合现在的工作,发现针对操作的优化,下面 这篇文章 可以翻译出来归档。以下为正文:
SQLite 有一个简洁的SQL接口,且以低内存占用著称。现如今,
SQLite 已经在 Android 及
iOS 开发中得到广泛的应用。本文主要讨论在 Android
应用如何优化 SQLite 的性能和资源占用。
1, 使用事务( Transaction )
在默认情况下每一个SQL语句都被包一个全新的事务内,比如执行一个如INSERT这样基本的数据库操作,就会放到一个新创建的事务中执行。一次只需要操作一次数据库操作时,让SQLite自己来进行事务管理当然是明智的。但如果一次有大量的操作要做时,比如循环调用INSERT添加时,这样就显得开销过大了,因为每一笔操作都要重新打开、写入,最后再关闭journal文件,
这个文件是临时用来保存数据操作的中间结果,详细内容看这里( 参考 )。
如果明确地在一系列SQL语句前后以 BEGIN TRANSACTION 及
END TRANSACTION
这样显示地使用事务就可以避免上面的情况。对于那些不会改变数据的操作,这样的方式也同样可以提速(好似数据库操作中单笔的操作效率将远低于批次操作,如果用SQL语句可以搞定的事,就不可使用Cursor进行操作)。
注明:除了发起事务外,你必须还要负责对事务的提交和回滚操作。
在Android应用开发中可以使用类似如下的方式使用 BEGIN TRANSACTION
及 END TRANSACTION :
db.beginTransaction();
try{
for(int i =0; i< LENGTH ; i++,sequenceNum++)
{
// execute SQL
}
db.setTransactionSuccessful();// marks a commit
}
finally{
db.endTransaction();
}
2. 使用索引
如果没有在数据库使用索引,当你在一个没有排序的数据表中使用映射查询(projection
query)搜索时,无可避免的要执行一个全序列查找。这种情况通常并不是什么问题,每种数据库,包括SQLite都会为数据集执行索引来降低查找时间。
索引维护着一个表中某一列或某几列的顺序,这样就可以快速定位到一组值,而不用扫遍全表。所有的索引信息会被保存在一个独立的索引表中,所以会产生额外的空间占用,不过绝对物超所值,特别是当你会在数据库中进行大量的读及搜索操作时。
SQLite会自动为每一个UNIQUE栏位创建索引,包括主键(Primary Key)栏位,另外也可以通过CREATE
INDEX进行显示地创建。
注:如果你的查询太复杂而无法使用所创建的索引,那你就要好好想想你数据库的结构了。
3. 在Where分支中使用限定符
如果以字串拼接出SQL语句的Where,莫不如使用SQLite的query操作带上'?'来编译查询。以下是它的好处:
a. 有利于SQLite缓存这些查询。
b. 可以避免达到SQLite缓存的上限。使用字串拼接Where的查询,每一个都被视为不同的查询,这就容易达到缓存的上限。
c. 可以避免非法的SQL注入。
转载
Cursor 就更是能不用就不用。比如成批的
DELETE/UPDATE ,将条件组装到
SQL 语句,会比使用 CURSOR
一条条的查再删效率要高很多(
若干年前就曾使用存储过程代替单笔操作,将一次批量计算时间从一晚上缩到了一小时以内
)。其次是对操作的优化:对于 INSERT/UPDATE
操作较多时使用事务,如果SELECT操作较多时,使用索引。
结合现在的工作,发现针对操作的优化,下面 这篇文章 可以翻译出来归档。以下为正文:
SQLite 有一个简洁的SQL接口,且以低内存占用著称。现如今,
SQLite 已经在 Android 及
iOS 开发中得到广泛的应用。本文主要讨论在 Android
应用如何优化 SQLite 的性能和资源占用。
1, 使用事务( Transaction )
在默认情况下每一个SQL语句都被包一个全新的事务内,比如执行一个如INSERT这样基本的数据库操作,就会放到一个新创建的事务中执行。一次只需要操作一次数据库操作时,让SQLite自己来进行事务管理当然是明智的。但如果一次有大量的操作要做时,比如循环调用INSERT添加时,这样就显得开销过大了,因为每一笔操作都要重新打开、写入,最后再关闭journal文件,
这个文件是临时用来保存数据操作的中间结果,详细内容看这里( 参考 )。
如果明确地在一系列SQL语句前后以 BEGIN TRANSACTION 及
END TRANSACTION
这样显示地使用事务就可以避免上面的情况。对于那些不会改变数据的操作,这样的方式也同样可以提速(好似数据库操作中单笔的操作效率将远低于批次操作,如果用SQL语句可以搞定的事,就不可使用Cursor进行操作)。
注明:除了发起事务外,你必须还要负责对事务的提交和回滚操作。
在Android应用开发中可以使用类似如下的方式使用 BEGIN TRANSACTION
及 END TRANSACTION :
db.beginTransaction();
try{
for(int i =0; i< LENGTH ; i++,sequenceNum++)
{
// execute SQL
}
db.setTransactionSuccessful();// marks a commit
}
finally{
db.endTransaction();
}
2. 使用索引
如果没有在数据库使用索引,当你在一个没有排序的数据表中使用映射查询(projection
query)搜索时,无可避免的要执行一个全序列查找。这种情况通常并不是什么问题,每种数据库,包括SQLite都会为数据集执行索引来降低查找时间。
索引维护着一个表中某一列或某几列的顺序,这样就可以快速定位到一组值,而不用扫遍全表。所有的索引信息会被保存在一个独立的索引表中,所以会产生额外的空间占用,不过绝对物超所值,特别是当你会在数据库中进行大量的读及搜索操作时。
SQLite会自动为每一个UNIQUE栏位创建索引,包括主键(Primary Key)栏位,另外也可以通过CREATE
INDEX进行显示地创建。
注:如果你的查询太复杂而无法使用所创建的索引,那你就要好好想想你数据库的结构了。
3. 在Where分支中使用限定符
如果以字串拼接出SQL语句的Where,莫不如使用SQLite的query操作带上'?'来编译查询。以下是它的好处:
a. 有利于SQLite缓存这些查询。
b. 可以避免达到SQLite缓存的上限。使用字串拼接Where的查询,每一个都被视为不同的查询,这就容易达到缓存的上限。
c. 可以避免非法的SQL注入。
转载
ZESTRON
2024-09-04 广告
2024-09-04 广告
在Dr. O.K. Wack Chemie GmbH,我们高度重视ZESTRON的表界面分析技术。该技术通过深入研究材料表面与界面的性质,为提升产品质量与可靠性提供了有力支持。ZESTRON的表界面分析不仅涵盖了相变化、化学反应、吸附与解吸...
点击进入详情页
本回答由ZESTRON提供
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询
广告 您可能关注的内容 |