如何从索引字段上排序的DB4O有效地检索每个第N个对象

时间:2011-08-24 19:58:43

标签: c# .net db4o

我在DB4O数据库中存储了很多事件。这些事件都有时间戳,我已将该字段编入索引。按时间戳排序检索所有事件(的枚举器)几乎不需要任何时间(因为它们未被激活)。但是,如果我只想每10个人退休一次,我可以循环,但接下来我需要做一个计数,这需要很长时间。甚至从Enumerable返回FirstOrDefault()(是的,我在C#和LINQ中)需要时间。如果字段已编入索引,那么在有序集中找到第一个字段应该不是很容易吗?

是的,我没有很多使用DB4O的经验,但我写的应用程序效果很好。通常我会将数百万个事件推送到数据库,然后根据短时间间隔检索一些事件。没问题,应用程序表现非常好。典型查询的响应时间小于100毫秒。

现在我想检索所有事件的样本。每十个左右......我怎么做到这一点?

1 个答案:

答案 0 :(得分:1)

您正在使用LINQ吗?你确定查询不花时间吗?因为LINQ查询是在您开始迭代时执行的。不是之前。

另请注意,db4o现在不使用索引进行排序。这意味着对于巨大的结果集,排序会很慢。

FirstOrDefault()已经花了很多时间?可能有两个原因。要么花时间,要么在那里执行查询。或者因为db4o需要时间activate the object。这是一个非常复杂的对象。我的猜测是查询时间可能是问题,因为你说.Count()操作占用了它的时间。

现在你想只获得每第10个对象。我相信.ElementAt()运算符尚未以db4o的优化形式实现。这意味着它将激活其间的每个对象。在最新的db4o版本中,.Skip()操作不应激活其间的每个对象。所以你可以跳到正确的位置使用.FirstOrDefault()那里。