【问题标题】:Android 5 Lollipop SQLite PerformanceAndroid 5 Lollipop SQLite 性能
【发布时间】:2014-11-22 06:44:34
【问题描述】:

在 Nexus 5 上进行测试,运行 Lollipop 更新,然后我的 SQLite 查询现在需要永远执行,我会说比 Ice Cream Sandwich 长 3 倍、4 倍

Android 4 附带 3.7 版本的 SQLite,Android 5 现在带有改进的 3.8 版本,它应该会带来 50% 的性能提升(至少在理论上)。

但是我根本没有看到这一点,SQLite 在 Lollipop 中的性能似乎很糟糕。

与运行 Ice Cream Sandwich 的旧 Galaxy 3 并排测试我的查询需要 1-2 秒,而 Lollipop 升级查询开始需要更长的 10-15 秒。

数据库已创建适当的索引。

问题只存在于棒棒糖中。

有没有人遇到过类似的问题,有什么解决方法的建议吗?

示例查询和解释查询输出:

SELECT DISTINCT 
 t.route_id, s.stop_name, s.stop_id, s.stop_lat, s.stop_lon, s.location_type 
FROM 
 stops s 
 INNER JOIN stop_times st ON s.stop_id=st.stop_id 
 INNER JOIN trips t ON t.trip_id=st.trip_id 
WHERE 
 s.lon > -111.84006 AND s.lon < -111.81482 AND 
 s.lat > 34.839073 AND s.lat < 34.86432 AND 
 service_id IN (SELECT service_id FROM calendar WHERE saturday='1')

【问题讨论】:

  • 答案是重写您的查询并添加适当的索引。如果没有数据库架构和查询本身,没有人可以帮助您。
  • 我发现您的评论无效。为每个 Android 版本重写 SQL 查询不是一个有效的解决方案。如上所述,查询在 Lollipop 之外需要 1-2 秒。问题仅限于 Android 5.0。
  • 所以您不希望您的查询在任何版本上都花费几毫秒?
  • 毫秒会很好:) 但让我失望的是它只发生在 5 点。我将使用示例查询更新帖子。
  • 我已经通过优化查询解决了这个问题。 R-Tree 似乎是解决这个问题的正确解决方案,但我想避免添加 SQLite 模块的复杂性,因为它在设备上运行。此外,我已经追踪到游标逻辑的瓶颈,我的查询本身现在需要几毫秒。我觉得你应该添加 R-Tree 指针作为解决方案,因为它在原始问题的上下文中是有效的。

标签: android performance sqlite android-5.0-lollipop


【解决方案1】:

Sqlite 3.8 引入了Next Generation Query Planner。它可能会做出不同的选择,但应该会更好。

(我在这里假设您的查询的查询计划在 sqlite 版本之间存在显着差异。您只发布了其中一个。)

请允许我引用 docs on the new planner 的摘录,“升级到 NGQP 的危险”:

但与任何查询规划器更改一样,升级到 NGQP 确实会带来引入性能回归的小风险。这里的问题不在于 NGQP 不正确、有缺陷或不如旧版查询规划器。鉴于有关指数选择性的可靠信息,NGQP 应始终选择与以前一样好或更好的计划。问题是某些应用程序可能在没有运行 ANALYZE 的情况下使用低质量和低选择性的索引。较老的查询计划者为每个查询考虑的可能实现要少得多,因此他们可能因愚蠢的运气而偶然发现了一个好的计划。另一方面,NGQP 着眼于更多查询计划的可能性,它可能会选择一个理论上效果更好的不同查询计划,假设索引良好,但由于数据的形状,它在实践中会产生性能回归.

总结:

  • 新的规划器更依赖于正确的统计信息(知道哪种策略会最快地排除最多的行)
  • 没有它们,可能会做出错误的选择(选择使用错误,甚至no索引)
  • 您应该使用 ANALYZE 更新表统计信息(或手动将典型/最坏情况的统计信息插入到统计信息表中)

所以,看看运行 ANALYZE 是否有助于提高查询性能。比较两个 sqlite 版本之前和之后的查询计划和性能(如果您将所有四种情况都发布给其他人看看差异,那就太酷了)。

【讨论】:

  • 在我使用全文搜索 (FTS3) 的情况下,ANALYZE 将性能提高了 50 倍。谢谢。
猜你喜欢
  • 1970-01-01
  • 2015-01-05
  • 2013-03-03
  • 1970-01-01
  • 2012-06-21
  • 1970-01-01
  • 1970-01-01
  • 2012-01-14
  • 1970-01-01
相关资源
最近更新 更多