4

既存の RavenDB セッションで次のクエリを実行すると:

var result = session.Query<Location>()
               .Customize(x => x.WaitForNonStaleResultsAsOfNow())
               .Where(l => l.Name = "Home" && !l.Deleted);

RavenDB はどのインデックスを待機しますか? 私の仮定では、クエリの時点ですべてのインデックスが最新になるのを待つということです。ただし、動的インデックスが 1 つしかなく、Location他のテーブルに 20 個のインデックスがある場合、常に 21 個のインデックスが更新されるのを待っているということでしょうか?

または、メソッドの機能を誤解していますか?

4

1 に答える 1

7

Fiddler を使用したクエリ中にデータベース通信を監視する場合、またはクエリで RavenQueryStatistics を次のように要求する場合...

RavenQueryStatistics stats;
var result = session.Query<Location>()
               .Customize(x => x.WaitForNonStaleResultsAsOfNow())
               .Statistics(out stats)
               .Where(l => l.Name = "Home" && !l.Deleted);

次に、次のようなプロパティが表示されます。

  • 古い
  • タイムスタンプ - クエリ結果が古くなったとき
  • IndexName - クエリ対象のインデックス
  • インデックスタイムスタンプ
  • IndexEtag - インデックスで最後に更新されたドキュメントに対応するドキュメント バージョン
  • ページングなどに関連するその他のこと。

これは、WaitFor(いくつかのバリアント) が満たすべきかどうかを判断するために使用する情報です。

したがって、TL;DR の答えは次のとおりです。クエリ対象のインデックスは 1 つだけです。すべてのインデックスをチェックするのは無駄です。

したがって、WaitForNonStaleResultsAsOfNow の場合、OK と表示されます。DateTime.Now を取得して、IndexTimestamp >= その日付まで結果を返さないでください。

これらの WaitFor- メソッドはアンチパターンのようなものです - 一貫した結果を得るためにそれらだけに依存するべきではありません.Loadを使用するようにUIまたはデータモデルを再設計する必要があります. / 一貫性が必要なドキュメント ID (ACID が保証されている場所) で保存します。

しかし、それがどのように行われるかを見ると、WaitForNonStaleResultsAsOfLastWrite を使用する方が良い考えであることがわかります。これにより、Raven クライアントは保存した最後のドキュメント E-Tag を記録し、その IndexETag がドキュメントに組み込まれるのを待ちます。索引。これは、「データを挿入し、更新されたグリッドに表示する」シナリオに特に当てはまります。すべてのインデックス作成が完了するのを待つ必要はありません。挿入した 1 つのものが表示されることを確認したいだけです。

于 2014-06-04T16:05:01.987 に答える