2015-04-01 76 views
0

我有一个查询在姜饼设备和Jellybean上运行得非常好,但在棒棒糖设备上运行速度较慢。我确定查询是正确的,并且写得很好,因为它在旧设备上运行良好。SQLite查询在Android棒棒糖上运行速度较慢

Cursor c; 
String query = QUERY STRING; 

c = db.rawQuery(query,new String[]{Integer.toString(a),Integer.toString(b)}); 

Log.e("SQL_QUERY_PROGRESS","1"); 

while(c.moveToNext()){ 
    Log.e("SQL_QUERY_PROGRESS","2"); 
    // Do stuff with data 
} 

c.close(); 

在姜饼设备,只有0.008的第二两个日志消息之间的,而在棒棒糖设备,它正在采取约8秒,这是非常慢的。

我无法理解的是,棒棒糖设备更新,并具有更多的RAM,CPU电源等,所以逻辑上确定新设备应该比旧设备更快地运行查询。

Lollipop上使用的Java版本可能存在错误,或者SQLite版本是否会导致速度大幅下降?

我用adb shell 并导航到数据库文件和运行使用的棒棒糖设备sqlite3查询等,这让我觉得它更像是一个Java的问题不是SQLite的问题,它跑了几乎瞬间。

我完全不知道什么可能导致延迟,所以任何帮助或想法将不胜感激,所以我可以进一步调查!

+0

棒棒堂设备通常有'userdata'分区加密 - 这会减慢许多与存储相关的操作,包括数据库访问。除此之外,新设备并不总是转化为更快的存储。游戏中有许多因素。所以,除非你想在同一个设备上的同一个数据集上运行不同的Android版本,并提供更多的信息 - 你的问题是模拟和脱离主题 – 2015-04-01 23:33:06

+0

你在主线程中运行查询还是运行在单独的线程(AsyncTask,Thread,IntentService ...)? – ucsunil 2015-04-01 23:33:33

+0

@AlexP。我用棒棒糖上的Nexus 5和Galaxy S4,姜饼上的Vodafone Smart II和Jellybean上的Galaxy S2上运行它,所以如果理论上速度不快,速度至少要低1000倍,那么这些设备的速度至少应该快一些! – PriestVallon 2015-04-01 23:37:04

回答

2

这是我如何解决这个问题。

  1. 首先你需要弄清哪些查询是有问题的。我用我自己的方法替换了所有rawQuery()调用。它会记录每个查询之间的时间。
private static Cursor runQuery(String query) { 
    System.out.println("QUERY: " + query); 
    Cursor tmpCursor = DatabaseManager.getInstance().openDatabase().rawQuery(query, null); 
    System.out.println("TIME: " + (System.currentTimeMillis() - Main.time)); 
    Main.time = System.currentTimeMillis(); 
    return tmpCursor; 
} 

检查时间,你怀疑你的代码的其他部分。 现在,您会看到在哪些查询中间会丢失时间。它实际上是光标逻辑,如c.moveToFirst(),它们是昂贵的。在这些之后进行时间检查,以验证。

  1. 当您找到查询时,请检查它并检查查询必须经过哪些列。在我的情况下,我在一个列中有一个巨大的行数的列上加入。这就是你需要为下一步列:
  2. 此列创建索引,例如:
    CREATE INDEX idx_bibref ON responses(bibreference);

可以在终端测试(sqlite3的)运行此或更好的把它放在你的onUpgrade方法。 就是这样。现在所有的游标方法都会再次运行,就像以前的Android版本一样。


旧文章:

我遇到同样的问题。我让它在异步任务中运行,所以我可以确认,正如PriestVallon所说,这是在主UI线程上运行,虽然效率不高,但不是问题的原因。 它只出现在棒棒糖上。在4.4手机和模拟器上运行。没有问题。 到目前为止,我的调查已经发现它与游标逻辑有关而不是查询本身。例如:

c.moveToFirst(); 
c.moveToNext(); 
c.getCount(); 
etc... 

通常在经过更复杂的连接查询(但我无法确认100%)后运行。

也许这可以帮助。

(我对把这个在回答中,反对评论道歉,但我没有足够的信誉评论)

+0

我也遇到过这个问题。我会很好奇,找出根源是什么。 – user1179330 2015-04-02 19:11:23

2

我有一个类似的问题 - 一个SQLite查询运行良好的预棒棒糖在棒棒糖上运行lot较慢。这是对3个连接表的查询,并且花费了10秒以上!

尝试各种事情之后,我发现这个问题:棒棒糖使用SQLite 3.8系统,采用了不同的查询优化,以及由于某种原因,它是使用的加入一个错误的指数。

在我的测试设备上获得DB副本后,我在查询中使用了命令行SQLite工具和“explain query plan”。比较3.8前后的输出,后者使用了不同的不正确的索引。

从我读到的情况来看,在数据库上运行“ANALYZE”可能会修复它,但由于我真的不需要使用错误的索引,我只是删除了索引。现在查询使用正确的索引,并且查询再次快速。