慢速db4o在Android上查询

时间:2011-08-30 14:46:10

标签: java android database db4o

目前我正在尝试将db4o集成到我的应用程序中。我有一个模型,其中包含 - 比如15个基元 - 包含在其他对象中。存储它们既简单又快速,但收到它们就是痛苦。我尝试过NativeQuerys和SODA没有太大的区别。为了给它们中的一些提供索引,可以进一步降低查询速度。

示例中的

:我的查询如下:

    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实现如下:

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;
        }

因此,通过上面的查询,我希望能够像存储的100个报告中的40个一样。我测量了查询和激活的时间,它大概是3,5秒!对我来说,这看起来非常慢! 我玩了一下,在查询中删除了比较器。现在我有大约1,2秒的执行时间。如果我用Collections.sort(myInstantiatedDatabaseReportList, mTimeComparator)手动对它们进行排序,它会在47 Millis中执行!难道我做错了什么? db4o比Collections.sort()花费的时间多10倍的原因是什么?

优化db4o模型的最佳方法是什么? (在这种情况下,Activatable没有用,因为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对象。正如我上面所写的那样,在我看来,索引使它变得更快!

1 个答案:

答案 0 :(得分:3)

有很多事情可能会出错。所以这是我的检查清单。

  • 确保此导航中的每个字段都已编入索引。 'report','begin'字段和'millis'字段。
  • 这些字段中的任何一个是接口还是泛型类型?然后db4o将不使用索引。您需要具体类型,以便db4o可以找出该字段的类型并使用索引。
  • 当您在Android上使用原生查询时,不需要optimize these at built time。原因是查询优化器无法处理
  • 什么是getBegin()返回的类型?如果它是常规Java日期,那么本机优化器不会比比较更大/更小。这只适用于SODA
  • 查询返回100个对象中的40个?然后排序不应该是一个大问题。
  • SODA也很慢?那有点奇怪。你能告诉我你的SODA查询吗?