2010-12-08 34 views
5

我是Android编程的新手,但我很习惯使用SQLite数据库。糟糕的SQLite实现?第一次数据访问的方式太慢

  • 我的应用程序打开SD卡上的SQLite3数据库,并运行一个相对复杂的查询(5联接,1子查询,2 where子句)使用SQLiteDatabase.rawQuery

    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毫秒!(与Cursor.getRowCount()相同,或者显然是首次访问实际结果集)。
  • 在PC(2 GHz,1 GB RAM,SATA2 HDD)上使用例如SQLiteSpy需要15 ms来显示结果集。
  • 在PC上使用C++实现它,它也是15毫秒高达30毫秒

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

+0

SD是很多甚至比IDE慢。 – 2010-12-08 19:48:00

回答

1

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

虽然我原来的文章中的配置慢了大约120倍,但我对完整的索引数据库(这意味着索引和主键在需要的任何地方)都是一样的,现在需要9 ms的查询现在是现在“仅”慢8倍:执行时间约为75毫秒。

这当然仍然是一个非常失望的结果,因为我不希望每次都使用索引,即使在真正的小表上。

2

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

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

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

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