如何提高db4o的查询速度?

时间:2012-09-07 13:43:57

标签: database optimization db4o large-data

OutOfMemoryError caused when db4o databse has 15000+ objects

我的问题是参考我之前的问题(上文)。对于相同的PostedMessage模型和相同的查询。

使用100,000个PostedMessage对象,查询大约需要1243毫秒才能返回前20个PostedMessages。

现在,我在db4o中保存了1,000,000个PostedMessage对象。相同的查询花了342,132毫秒。这是非线性的。

如何优化查询速度?

FYR: timeSent和timeReceived是索引字段。 我正在使用SNAPSHOT查询​​模式。 我没有使用TA / TP。

2 个答案:

答案 0 :(得分:0)

你对结果进行排序吗?不幸的是,db4o不使用索引进行排序/ orderBy。这意味着它将运行常规排序算法,使用O(n * log(n))。它不会scala liniearly。

db4o也不支持TOP运算符。这意味着即使没有排序,也需要花费相当多的时间将ID复制到结果集,即使之后您从未阅读过实体。

所以,除了尝试使用一些减少结果大小的标准外,没有真正好的解决方案。

有些冒犯的人可能会使用不同的query evaluation,但我个人不建议这样做。

答案 1 :(得分:0)

@Gamlor不,我根本没有排序。代码如下:

public static ObjectSet<PostedMessage> getMessagesBetweenDates(
        Calendar after,
        Calendar before,
        ObjectContainer db) {

    if (after == null || before == null || db == null) {
        return null;
    }
    Query q = db.query(); //db is pre-configured to use SNAPSHOT mode.
    q.constrain(PostedMessage.class);
    Constraint from = q.descend("timeRecieved").constrain(new Long(after.getTimeInMillis())).greater().equal();
    q.descend("timeRecieved").constrain(new Long(before.getTimeInMillis())).smaller().equal().and(from);
    ObjectSet<EmailMessage> results = q.execute();
    return results;
}

此方法的参数如下:

after = 13-09-2011 10:55:55

之前= 13-09-2011 10:56:10

我希望在“之后”和“之前”之间只返回10个PostedMessages。 (我正在生成虚拟的PostedMessage,timeReceived各增加1秒。)