2011-08-30 65 views
0

目前我正在嘗試將db4o整合到我的應用程序中。我有一個模型包含 - 可以說15個基元 - 包裝在其他對象中。存儲他們是容易和快速的,但接受他們是痛苦。我嘗試了NativeQuerys和SODA,沒有太大區別。爲了給它們中的一些索引減慢查詢甚至更多。Android上的緩慢db4o查詢

實施例中:我有一個查詢看起來像這樣:上述我希望recievce像存儲100所報告的40

public static class DatabaseScheduleReportTimeComparator implements Comparator<DatabaseReport>{ 

    @Override 
    public int compare(DatabaseReport object1, 
      DatabaseReport object2) { 

     long first = object1.getReport().getBegin().getMillis(); 
     long second = object2.getReport().getBegin().getMillis(); 
     if (first < second) return 1; 
     if (first > second) return -1; 
     else { 
      first = object1.getReport().getEnd().getMillis(); 
      second = object2.getReport().getEnd().getMillis(); 
      if (first > second) return 1; 
      if (first < second) return -1; 
      else return 0; 
     } 
使用查詢

這樣:

public List<DatabaseReport> getCurrentDeviationReportsOnly(){ 
    final long now = System.currentTimeMillis(); 
    return getDatabase().query(new Predicate<DatabaseReport>() { 
     @Override 
     public boolean match(DatabaseReport candidate) { 
      return candidate.getReport().getBegin().getMillis() < now 
       && candidate.getReport().getEnd().getMillis() > now; 
     } 
    }, mTimeComparator); 

mTimeComparator被實現爲以下。我測量了查詢和激活的時間,其約3,5秒!!!對我來說,這看起來非常慢! 我玩了一會兒,並在我的查詢中刪除了比較器。現在我的執行時間大約爲1,2秒。如果我用Collections.sort(myInstantiatedDatabaseReportList, mTimeComparator)手動對它們進行排序,它將在47 Millis中執行!難道我做錯了什麼? db4o喜歡比Collections.sort()多10倍以上的原因是什麼?

爲db4o優化我的模型的最佳方法是什麼? (激活的不是在這種情況下有用,因爲ResultingList將在ListAdapter,這就需要每一個成員通過。)

編輯:由於下面的答案,我在這裏插入我的SodaQuery,太:

public List<DatabaseReport> getCurrentDeviationReports(){ 
    final Date now = new Date(System.currentTimeMillis()); 

    Query query = getDatabase().query(); 
    query.constrain(DatabaseReport.class); 
    query.descend("mReport").descend("begin").descend("datetime").constrain(now).smaller(); 
    query.descend("mReport").descend("end").descend("datetime").constrain(now).greater(); 
    query.descend("mReport").descend("begin").descend("datetime").orderAscending(); 
    query.descend("mReport").descend("end").descend("datetime").orderDescending(); 
    return query.execute(); 

} 

所以這裏的「datetime」是一個java.util.date對象。正如我上面寫的,在我看來,索引使它變得更加鬆弛!

+0

也許您應該在相關字段中添加索引? –

回答

3

有很多事情可能會出錯。所以這是我的檢查清單。

  • 確保沿着這個導航每個字段建立索引。 '報告','開始'字段和'毫米'字段。
  • 這些字段中的任何一個是接口還是泛型?然後db4o將不會使用索引。您需要具體類型,以便db4o可以找出該字段的類型並使用索引。
  • 當你在Android上使用本機查詢時,不是那麼那麼你需要optimize these at built time。原因是查詢優化器無法處理
  • getBegin()返回的類型是什麼?如果它是一個普通的Java日期,那麼本機優化器不會比比較更大/更小。這隻適用於SODA
  • 查詢返回40個100對象?那麼排序不應該是一個大問題。
  • SODA也很慢?那有點奇怪。你可以告訴我你的SODA查詢嗎?