如何调试:ravendb索引总是过时的

如何调试:ravendb索引总是过时的,ravendb,Ravendb,我使用的是RavenDB版本888 我的客户端应用程序将数十万个文档插入RavenDB。它很好用。插入之后,我的应用程序将从我预定义的静态索引中查询一些数据。我不想要陈旧的结果,所以我的应用程序会定期查询,直到索引是最新的 不幸的是,今天我发现我的应用程序挂起了(更准确地说,一次又一次地查询RavenDB),因为服务器总是告诉它索引仍然过时。这有点奇怪,因为上次插入很早以前就完成了——理论上,服务器应该已经完成了索引 我查看了ManagementStudio并检查了我最简单的索引,该索引依赖于我

我使用的是RavenDB版本888

我的客户端应用程序将数十万个文档插入RavenDB。它很好用。插入之后,我的应用程序将从我预定义的静态索引中查询一些数据。我不想要陈旧的结果,所以我的应用程序会定期查询,直到索引是最新的

不幸的是,今天我发现我的应用程序挂起了(更准确地说,一次又一次地查询RavenDB),因为服务器总是告诉它索引仍然过时。这有点奇怪,因为上次插入很早以前就完成了——理论上,服务器应该已经完成了索引

我查看了ManagementStudio并检查了我最简单的索引,该索引依赖于我的文档集合的一种类型。有趣的是,索引给出的计数是最新的(与我在ManagementStudio的“Collections”选项卡中看到的数字相同),但状态是“stale”。最近的更新显示“6小时前”。总的来说,我的索引中有一半像这样陈旧,但另一半是新的

我不知道为什么RavenDB会让它们过时,也不知道RavenDB现在在做什么。它的CPU使用率不高。如何调试该场景

更新:

我想我发现了一件可能有助于找到根本原因的事情。在比较了我的非陈旧索引和总是陈旧的索引之后,reduce结果似乎很重要:陈旧的索引在reduce结果中具有大值属性,而最新的索引具有小值属性

public class ReduceResult
{
    public string ID { get; set; }
    public string Key { get; set; }
    public long Value { get; set; } //This field seems to matter
}
以下是我的索引定义之一:

public class InternalPageCountIndex : AbstractIndexCreationTask<InternalPage, ReduceResult>
{
    public InternalPageCountIndex()
    {
        Map = posts => from post in posts
                       select new
                       {
                           Key = post.BatchID,
                           Value = 1
                       };

        Reduce = results => from result in results
                            group result by result.Key
                                into g
                                select new
                                {
                                    Key = g.Key,
                                    Value = g.Sum(c => c.Value)
                                };
    }
}
公共类InternalPageCountIndex:AbstractIndexCreationTask
{
公共内部页面计数索引()
{
Map=posts=>from post in posts
选择新的
{
Key=post.BatchID,
值=1
};
Reduce=results=>from result in results
按结果分组结果。键
进入g
选择新的
{
键=g键,
Value=g.Sum(c=>c.Value)
};
}
}
顺便说一句,服务器日志看起来也很有趣。今天下午,服务器认为没有工作要做:

2012-04-07 16:36:44.6725,Raven.Database.Tasks.ReduceTask,Debug,索引00:00:03.5535907中的65个reduce键,索引SNRTotalByteSizeIndex的结果为493666, 2012-04-07 17:35:21.1888,Raven.Database.Indexing.WorkContext,调试,“未找到任何工作,workerWorkCounter:5,for:ReducedExecuter,将等待其他工作”, 2012-04-07 17:35:21.1888,Raven.Database.Indexing.WorkContext,调试,“未找到任何工作,workerWorkCounter:5,for:IndexingExecuter,将等待其他工作”, 2012-04-07 18:35:39.4759,Raven.Database.Indexing.WorkContext,调试,“未找到任何工作,workerWorkCounter:5,for:ReducedExecuter,将等待其他工作”, 2012-04-07 18:35:39.4759,Raven.Database.Indexing.WorkContext,调试,“未找到任何工作,workerWorkCounter:5,for:IndexingExecuter,将等待其他工作”, 2012-04-07 19:35:56.5994,Raven.Database.Indexing.WorkContext,调试,“未找到任何工作,workerWorkCounter:5,for:ReducedExecuter,将等待其他工作”, 2012-04-07 19:35:56.5994,Raven.Database.Indexing.WorkContext,调试,“未找到任何工作,workerWorkCounter:5,for:IndexingExecuter,将等待其他工作”, 2012-04-07 20:36:12.3345,Raven.Database.Indexing.WorkContext,调试,“未找到任何工作,workerWorkCounter:5,for:ReducedExecuter,将等待其他工作”, 2012-04-07 20:36:12.3345,Raven.Database.Indexing.WorkContext,调试,“未找到任何工作,workerWorkCounter:5,for:IndexingExecuter,将等待其他工作”

但当我今晚通过ManagementStudio查询RavenDB以查看有多少过时索引时,服务器开始执行map/reduce!是的,从下午到今晚之间没有插入,但是服务器在studio查询之后发现与索引有关

2012-04-07 21:23:16.9357,Raven.Database.Tasks.ReduceTask,Debug,读取00:03:05.6481176中的1个reduce键,索引InternalPageCountIndex的结果为505406

2012-04-07 21:23:19.5103,Raven.Database.Indexing.Index.Indexing,Debug,“索引PageCountMissingDescriptionIndex中的批次索引/1结果给出的文档:\减少\键I-:批次/1键是:批次/1值是:505406值\范围是:505406”

2012-04-07 21:23:19.6797,Raven.Database.Indexing.Index.Indexing,Debug,Reduce为InternalPageCountIndex生成了1个条目,用于Reduce键:批次/1, 2012-04-07 21:23:19.6797,Raven.Database.Tasks.ReduceTask,Debug,索引1 reduce key in 00:00:02.7426449,索引InternalPageCountIndex的结果为505406

根据studio查询,服务器仍然告诉我,我的索引有一半已过时:(


看起来您正在对BatchID进行reduce,并且有许多项具有相同的批id。 这意味着对于每个唯一密钥,我们必须加载该唯一密钥的所有映射结果,在您的情况下,有505406个,因此这需要时间。 绘制结果图花费的时间相对较少。 减少它们需要时间,因为我们需要减少大量数据。

这是一个bug


多亏了Ayende和RavenDB团队,这一问题自构建909以来就得到了解决。更多信息请参见。

请向我们展示代码。请查看我的更新,谢谢@DanielLangHi Ayende,谢谢你的回复。我有点明白你所说的“大减少”的意思。但是,在我的例子中,实际上只有1个batchId,这意味着只有1个唯一的密钥。请给出n根据stale索引,505406个映射结果已经减少了——根据总计数,这些结果应该是全部的,而且这个数字在24小时内不会增加