我有一个SQLite数据库,表中有6,000多行地址。这是一个只读数据库-应用程序构建和部署后没有更新或更改。我在state字段上有一个索引。我的应用程序使用一个简单的select语句来获取与给定状态匹配的所有行。我使用explain和explain查询计划语句来查看我的查询是否使用了索引。
大多数情况下,查询返回的时间不到一秒钟-不是很好,但对于我的应用程序来说已经足够好了。
查询通常需要更长的时间--甚至长达14秒,通常是3-4秒。在同一电话上的完全相同的只读数据库(和表)上的完全相同的查询,由完全相同的二进制调用。
我可以看到没有垃圾收集正在发生,并且监视logcat也没有生成异常
只是有时会发生一些变化。创建不一致的用户体验的变体。
看起来SQLite数据库系统正在被其他应用程序共享--比如电子邮件客户端。会不会是我的查询排在另一个应用程序的查询之后,因此差异是由于共享SQLite数据库系统实际开始运行我的查询?如果是这样,是否可以“创建我自己的SQLite实例”,以便获得一致的性能?
如果它不是一个共享的SQLite数据库系统(因此我有自己的实例),那么在其他条件相同的情况下,还有什么原因会导致查询性能出现如此大的差异?
请注意,我不能轻松地将数据放入内存中运行查询,因为行很长(除了地址之外还有更多信息),而且我的代码中还有许多其他部分使用了更复杂的select查询。我已经将性能差异缩小到这个问题的最简单的"select where state =“查询(请求帮助)。
发布于 2012-02-16 03:33:17
似乎SQLite数据库系统正在被其他应用程序共享-例如电子邮件客户端。
不完全同意。存储空间由其他应用程序共享。在Android1.x和大多数2.x设备上,内部存储是格式化的YAFFS2,一次只允许一个进程访问存储。对于运行ext4而不是YAFFS2的Android 3.0+设备(以及大约2.3台设备)来说,这应该不是什么大问题。
会不会是我的查询排在另一个应用程序的查询之后,因此差异是由于共享的SQLite数据库系统实际开始运行我的查询?
不完全同意。不过,您的磁盘I/O可能排在另一个应用程序的磁盘I/O之后。
https://stackoverflow.com/questions/9299891
复制相似问题