2014-11-22 95 views
2

测试在Nexus 5,跑了棒棒糖更新,之后我的SQLite查询现在需要永远执行我会说,3倍,4倍倍比冰淇淋三明治Android的5棒棒糖SQLite的性能

的Android 4.0与航运更长3.7版本的SQLite,Android 5现在带有改进的3.8版本,本来应该引入50%的性能提升(理论上至少)。

然而,我没有看到这一点,SQLite的表现似乎在棒棒糖里很可怕。

与老银河3运行冰淇淋三明治并排测试我的查询需要1-2秒,在棒棒糖升级查询开始需要更长的10-15秒后。

DB创建了适当的索引。

问题只存在于棒棒糖中。

有没有人遇到过类似的问题,以及有关如何解决的建议?

样品查询&解释查询的输出:

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') 

enter image description here

+0

答案是重写您的查询并添加apprpriate索引。没有数据库模式和查询本身,没有人可以帮助你。 – 2014-11-22 10:06:53

+0

我觉得你的评论无效。重新编写每个Android版本的SQL查询不是一个有效的解决方案。如上所述,查询在棒棒糖之外需要1-2秒。问题仅限于Android 5.0。 – AlexVPerl 2014-11-22 14:52:05

+0

所以你不希望你的查询在任何版本上花费几毫秒? – 2014-11-22 14:54:39

回答

1

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

(我假设在这里,您所查询的查询计划以显著方式源码版本之间的不同。你只发布其中的一个。)

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

但是,与任何查询计划员更改一样,升级到NGQP确实带来了引入性能回归的小风险。这里的问题并不是NGQP不正确或者错误或者比传统查询规划器差。给出有关指数选择性的可靠信息,NGQP应该总是选择一个与以前一样好或更好的计划。问题在于某些应用程序可能使用低质量和低选择性的索引而未运行ANALYZE。较早的查询计划人员针对每个查询查看的可能实现数量较少,因此他们可能会因愚蠢的运气而绊倒好计划。另一方面,NGQP着眼于更多的查询计划可能性,并且它可以选择一个理论上更好的不同查询计划,假设索引良好,但由于数据的形状而在实践中给出性能回归。

总结:

  • 新的策划者更依赖于正确的统计(知道哪个策略将排除行数最多速度最快)
  • 没有他们,可能做出错误的选择(选择到使用错误的,甚至是没有索引)
  • 你应该使用ANALYZE更新你的表统计信息(或者从典型/最坏情况手动插入统计信息到统计表中)

因此,看看运行ANALYZE是否有助于您的查询性能。比较两个sqlite版本之前和之后的查询计划和性能(如果您发布了所有四种情况以供其他人查看差异,那么它会很酷)。

+0

在我的全文搜索(FTS3)的情况下,ANALYZE性能提高了50倍。谢谢。 – 2016-02-02 17:53:13