RavenDB - проблема с запросами - устаревшие результаты / индексы - PullRequest
6 голосов
/ 03 января 2012

Запрашивая 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();

Когда я выполню это, тогда ACount и BCount получат свои значения сразу при первом запуске).Однако CCount и DCount не получают свои значения только после трех или четырех запусков.Они показывают значение 0 (ноль) в первых нескольких прогонах.

Почему это происходит для двух нижних, а не двух верхних запросов?Если это из-за устаревших результатов (или индексов), то как я могу изменить свои запросы, чтобы получать точные результаты каждый раз, когда я запускаю его впервые.Спасибо за помощь.

Ответы [ 3 ]

14 голосов
/ 03 января 2012

Если вы не определили индекс для запроса Movies, Raven создаст Dynamic Index . Если вы используете запрос несколько раз, индекс будет автоматически сохранен. В противном случае Raven откажется от него, и это может объяснить, почему вы получаете 0 результатов во время первых нескольких запусков.

Вы также можете поручить Raven дождаться процесса индексации, чтобы гарантировать, что вы всегда будете получать наиболее точные результаты (даже если это может быть не очень хорошей идеей, поскольку это замедлит ваши запросы) с помощью WaitForNonStaleResults. инструкция:

session.Query<Movies>()
.Customize(x => x.WaitForNonStaleResults())
.Where(x => x.Status == "Released")                                              
.Count();
1 голос
/ 23 ноября 2017

У вас есть следующие опции в соответствии с официальной документацией (наиболее предпочтительным в первую очередь):

  1. Настройка точки отсечения .

    WaitForNonStaleResultsAsOfLastWrite(TimeSpan.FromSeconds(10)) или WaitForNonStaleResultsAsOfNow()

    Это гарантирует, что вы получите последние результаты до этого момента времени (или до последней записи).И вы можете поставить на него ограничение (например, 10 с), если вы хотите пожертвовать свежестью результатов для более быстрого получения ответа.

  2. Явное ожидание нестандартных результатов WaitForNonStaleResultsAsOfNow(TimeSpan.FromSeconds(10))

    Опять же, установка времени ожидания была бы хорошей практикой.

  3. Настройка соглашений о запросах для применения того же самогоПравило для всех запросов

    store.Conventions.DefaultQueryingConsistency = ConsistencyOptions.AlwaysWaitForNonStaleResultsAsOfLastWrite.

1 голос
/ 02 апреля 2012

Необходимость помещать WaitForNonStaleResults в каждый запрос ощущается как массивный «запах кода» (как бы я ни ненавидел этот термин, здесь он кажется вполне уместным).

Единственное реальное решение, которое я нашел, такдалеко:

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

Производительность соответственно снижается, но я думаю, что более медленная производительность - гораздо меньший грех, чем ненадежный, если не совсем неточные результаты.

...