我在DB4O数据库中存储了很多事件。这些事件都有时间戳,我已将该字段编入索引。按时间戳排序检索所有事件(的枚举器)几乎不需要任何时间(因为它们未被激活)。但是,如果我只想每10个人退休一次,我可以循环,但接下来我需要做一个计数,这需要很长时间。甚至从Enumerable返回FirstOrDefault()(是的,我在C#和LINQ中)需要时间。如果字段已编入索引,那么在有序集中找到第一个字段应该不是很容易吗?
是的,我没有很多使用DB4O的经验,但我写的应用程序效果很好。通常我会将数百万个事件推送到数据库,然后根据短时间间隔检索一些事件。没问题,应用程序表现非常好。典型查询的响应时间小于100毫秒。
现在我想检索所有事件的样本。每十个左右......我怎么做到这一点?
答案 0 :(得分:1)
您正在使用LINQ吗?你确定查询不花时间吗?因为LINQ查询是在您开始迭代时执行的。不是之前。
另请注意,db4o现在不使用索引进行排序。这意味着对于巨大的结果集,排序会很慢。
FirstOrDefault()已经花了很多时间?可能有两个原因。要么花时间,要么在那里执行查询。或者因为db4o需要时间activate the object。这是一个非常复杂的对象。我的猜测是查询时间可能是问题,因为你说.Count()操作占用了它的时间。
现在你想只获得每第10个对象。我相信.ElementAt()运算符尚未以db4o的优化形式实现。这意味着它将激活其间的每个对象。在最新的db4o版本中,.Skip()操作不应激活其间的每个对象。所以你可以跳到正确的位置使用.FirstOrDefault()那里。