Hi,
any chance to restrict your object-set via an additional constraint? If I remember correctly, db4o doesn't use indices for ordering an object-set (at least this is true if the resulting object-set is too large).
The following example (additional constraint is marked as bold) executes "your" query in about 2 milliseconds. Maybe your application can remember some kind of "watermark"-index for the last inserted items.
Cheers, Maik
import java.io.File;
import com.db4o.Db4o;
import com.db4o.ObjectContainer;
import com.db4o.config.Configuration;
import com.db4o.query.Query;
public class OrderTest {
private int index;
public OrderTest(int index) {
this.index = index;
}
public String toString() {
return "" + index;
}
public static void main(String[] args) {
new File("test.yap").delete();
Configuration config = Db4o.newConfiguration();
config.objectClass(OrderTest.class).objectField("index").indexed(true);
ObjectContainer db4o = Db4o.openFile(config, "test.yap");
for (int i = 0; i < 100000; i++) {
db4o.store(new OrderTest(i));
}
db4o.commit();
Query query = db4o.query();
query.constrain(OrderTest.class);
query.descend("index").constrain(99900).greater();
query.descend("index").orderDescending();
for (int i = 0; i < 20; i++) {
long start = System.currentTimeMillis();
System.out.println(query.execute().subList(0,10));
System.out.println(System.currentTimeMillis() - start);
}
db4o.close();
}
}
http://db4o.blogspot.com/