我在三星Galaxy GT-I9000设备的Android应用程序中遇到SQLite数据库的性能问题。该数据库包含10个表,每个表有3到8列。
一旦数据库文件获得大约400 KB更新/ instert查询需要更多时间执行 - 2秒!与其他设备(HTC Magic,HTC Desire)相比,更新/插入查询大约需要40毫秒!
数据库文件位于应用程序数据目录中。将数据库文件移动到SD卡会显着提高速度。
Periodic ANALYZE和VACUUM命令不会影响速度。以及PRAGMA cache_size命令。
您对如何提高性能有任何想法吗?
除了将数据库保存在SD卡中或将数据库拆分为包含每个表的许多文件之外,欢迎任何想法。
答案 0 :(得分:4)
三星Galaxy S对内部SD卡的访问速度非常慢。有多种inofficial lag fixes可用,似乎三星的RFS文件系统负责延迟。
希望三星会发布修复此问题的更新,在此之前,最好的办法是尽可能避免I / O.
答案 1 :(得分:3)
使用事务和参数化查询。如果不使用参数化查询,Sqlite必须解析每个sql语句。所有这些不必要的解析使得简单的插入语句慢2到3倍。见这里:How do I get around the "'" problem in sqlite and c#?
使用事务也非常重要,因为Sqlite可以非常快地执行插入,但提交速度很慢,因此您必须将插入/更新和删除捆绑到一个大事务中。
答案 2 :(得分:2)
批量插入命令应在事务中完成:
BEGIN TRANSACTION;
// INSERTS
COMMIT;
答案 3 :(得分:2)
这有很大帮助,并且激励我去搜索更多。我发现了一个可以带来巨大推动力的解决方案:
PRAGMA synchronous = OFF
INSERT / UPDATE查询运行速度提高了4倍。
但它有一个小缺点。
这里有更多细节:
http://web.utk.edu/~jplyon/sqlite/SQLite_optimization_FAQ.html#pragmas