2012-01-29 33 views
1

我正在开发一个应用程序,它需要原始传输数据并显示即将到来的列车时刻表。我用下面的查询检索站的列表(从包含的停止时间大约50,000项表):SQLite查询:从浏览器到Android的巨大减速

SELECT DISTINCT SUBSTR(stops._id, 0, LENGTH(stops._id)) as _id, stops.stop_name 
FROM trips, stop_times, stops         
WHERE trips._id = 'B' 
AND trips.trip_id = stop_times._id 
AND stop_times.stop_id = stops._id 

我跑在SQLite浏览器这个查询,并在约0.8秒执行。但是当我使用rawQuery()在我的DatabaseHelper类中执行它时,我的物理设备需要超过5分钟。我添加了一些日志记录来查看减速发生的位置,看起来这是查询本身需要很长时间,而不是View的通货膨胀。当我执行没有DISTINCT选项的相同查询时,它在大约1秒内执行。

我可以理解Android库比浏览器花费更长的时间来执行,但它不应该慢几百倍。是否有关于造成这种情况的DISTINCT选项的问题?

+0

实际上,我预计你的Android设备会比好台式机或笔记本电脑慢几百倍! – 2012-01-29 23:01:51

+0

是的,但没有DISTINCT选项,它在设备上执行1秒钟。我意识到这会为查询增加更多工作,但它似乎仍然过于缓慢。我很好奇,DISTINCT通常会有如此激烈的效果。如果这是付出的代价,我需要找到另一种获取数据的方式。 – Matt 2012-01-29 23:04:50

+0

我不知道substr函数是否缓慢。你可以通过'选择不同的stops._id作为_id,...'?至少以这种方式测试可以帮助指出问题。 – dokkaebi 2012-01-29 23:05:40

回答

0

DISTINCT需要时间来处理,因为它是分类和选择的问题。如果你有大量数据,DISTINCT会让它变得更糟。我建议你把你的查询分解成更小的部分和/或做实际的过滤

+0

我想我会想出一个不同的方法。这是否与将返回的数据添加到Cursor对象有关?再次,这在SQLite浏览器中花费了不到一秒钟的时间。 – Matt 2012-01-29 23:29:55

+0

不,游标不应该成为问题。你可以做的是在没有DISTINCT的情况下获取记录(因为它只需要一秒钟),然后通过你的代码执行这种区分。我希望它应该比旧技术减少很多时间 – waqaslam 2012-01-30 06:58:30

+0

最后,我只需要将火车路线上的stop_times表分开,并添加一些应用程序代码以确定要查看哪个表。这大大缩短了需要的时间执行查询。我发现在我的电脑上花费超过0.1秒的时间在设备上花费的时间太长。 – Matt 2012-02-16 02:54:36