RavenDB - 查询问题 - 陈旧的结果/索引

时间:2012-01-03 15:34:03

标签: nosql ravendb

在查询RavenDB时,我注意到它没有立即得到预期的结果。可能与索引有关,我不知道。

例如:

   int ACount = session.Query<Patron>()
                   .Count();

   int BCount = session.Query<Theaters>()
                   .Count();

   int CCount = session.Query<Movies>()
                   .Where(x => x.Status == "Released")                                              
                   .Count();

   int DCount = session.Query<Promotions>()
                    .Count();

当我执行此操作时,ACountBCount会在第一次运行时立即获取其值。但是,CCountDCount在三到四次运行之后才会获得它们的值。它们在前几次运行中显示0(零)值。

为什么这会发生在底部两个而不是前两个查询?如果因为陈旧的结果(或索引),那么当我第一次运行时,如何修改我的查询以获得每次的准确结果。谢谢你的帮助。

3 个答案:

答案 0 :(得分:14)

如果您尚未为电影查询定义索引,Raven将创建Dynamic Index。如果重复使用查询,索引将自动保留。否则Raven将丢弃它,这可以解释为什么你在前几次运行中获得0结果。

您还可以指示Raven等待索引过程,以确保您始终可以使用 WaitForNonStaleResults获得最准确的结果(即使这可能不是一个好主意,因为它会减慢查询速度) 指示:

session.Query<Movies>()
.Customize(x => x.WaitForNonStaleResults())
.Where(x => x.Status == "Released")                                              
.Count();

答案 1 :(得分:1)

需要在每个查询中放置WaitForNonStaleResults感觉就像一个巨大的“代码味道”(就像我通常讨厌这个术语一样,这里似乎完全合适)。

到目前为止,我找到的唯一真正的解决方案是:

var store = new DocumentStore(); // do whatever
store.DatabaseCommands.DisableAllCaching();

性能受到相应的影响,但我认为,如果不是完全不准确的结果,那么较慢的性能远不是不可靠的。

答案 2 :(得分:1)

根据the official documentation(最优先的第一个),您有以下选项:

  1. 设置截止点

    WaitForNonStaleResultsAsOfLastWrite(TimeSpan.FromSeconds(10)) 要么 WaitForNonStaleResultsAsOfNow()

    这将确保您获得截至该时间点的最新结果(或直到最后一次写入)。如果你想牺牲结果的新鲜度来更快地接收响应,你可以盖上它(例如10秒)。

  2. 明确等待非陈旧结果 WaitForNonStaleResultsAsOfNow(TimeSpan.FromSeconds(10))

    同样,指定超时是一种很好的做法。

  3. 设置查询约定以将同一规则应用于所有请求

    store.Conventions.DefaultQueryingConsistency = ConsistencyOptions.AlwaysWaitForNonStaleResultsAsOfLastWrite