可怜的SQLite实现?第一次数据访问方式太慢

时间:2010-12-08 19:22:13

标签: android sqlite

我是Android编程的新手,但是我很习惯使用SQLite数据库。

  • 我的应用程序在SD卡上打开SQLite3数据库并使用SQLiteDatabase.rawQuery

    运行相对复杂的查询(5个连接,1个子查询,2个where子句)
    public Cursor queryDataBase(String sql, String[] selectionArgs){
        Cursor c = myDB.rawQuery(sql, selectionArgs);
        return c;
    }
    
  • SQL语句由硬编码String提供。

  • 查询返回585行,共24列。
  • 我不得不在存储空间和索引之间进行权衡,但是在所有较大的表(目前大约约40,000个条目)上使用索引,SQLite显示查询:Steps: 155 , Sorts: 0, AutoIdx: 1077
  • 我没有使用主键,因此我也没有将任何内容重命名为“_id”。

  • 执行rawQuery相对较快,执行时间约为 2 ms

  • 访问此数据需要花费太多时间,例如通过c.moveToFirst(),执行时间大约是 1700 ms! (对于Cursor.getRowCount()来说相同,或者显然是第一次访问实际结果集)。
  • 在PC(2 GHz,1 GB RAM,SATA2 HDD)上进行相同操作SQLiteSpy需要 15 ms 才能显示结果集。
  • 使用C ++实现在PC上执行此操作时, 15 ms至30 ms

那我在这里错过了什么?我的手机800 MHz,2 GB RAM,MicroSD实际上可能慢了约120倍吗?

2 个答案:

答案 0 :(得分:2)

  

rawQuery的执行速度相对较快,执行时间约为2毫秒。

     

访问此数据需要花费太多时间,例如通过c.moveToFirst(),执行时间大约是1700毫秒! (Cursor.getRowCount()相同,或者显然是第一次访问实际结果集)。

这就是关键:rawQuery实际上并没有执行查询,但是直到第一次需要使用查询结果时才会延迟。

来源: http://groups.google.com/group/android-developers/browse_thread/thread/c9277225f8dbc4d1/65de841f284f09e6?lnk=gst

答案 1 :(得分:1)

除了仍然比在PC上慢一点,问题似乎是处理未编制索引的字段。

虽然原始帖子中的配置速度慢了大约120倍,但我尝试使用完整的索引数据库(这意味着在需要的地方无处不在的索引和主键),而现在在PC上需要9毫秒的查询“只有“慢8倍:执行时间约为75毫秒。

这当然是一个非常令人失望的结果,因为我不想每次都使用索引,即使在非常小的桌子上也是如此。