1

RavenDB サイトでは、「ドキュメント ID がわかっている場合は Load over Query を使用してください」と書かれています。約 1,500 個のオブジェクトの単純なコレクションに対する私のテストでは、読み込みは常に遅くなります。なんで?

ロード:

var doc = session.Load<Document>("Documents/123");

クエリ

var doc = session.Query<Document>().Where(x => x.Id == "123").SingleOrDefault();

すべてのドキュメントを取得するテストでは、平均クエリ時間は 66 ミリ秒で、ロードの場合は 137 ミリ秒でした。RavenDB インスタンスは別のオフィスにあるため、時間がかかります。とにかく、ロードは常に高速であるとは限りませんか?

編集

これは、私がhttp://ravendb.net/kb/31/my-10-tips-and-tricks-with-ravendbを参照しているステートメントです。ヒント#4。違いますか?

4

2 に答える 2

5

私が理解していることから、インデックスがまだ更新されていない場合、クエリは結果を返さない可能性がありますが、ロードは結果を返すことを保証します (データベースに id が存在する場合)。

レコードを挿入し、次の行で Query を使用して同じレコードを取得しようとしても、何も返されないというシナリオが考えられます。このシナリオでは、Load はレコードを返します。

したがって、表示されているパフォーマンスの低下は、クエリを使用するときにインデックスでクエリを実行しているのに対し、ロードが実際のデータ ストアにヒットしているという事実に関連している可能性があると思います。

于 2013-07-05T07:49:34.740 に答える
4

アイテムを で取得する場合Idは、 メソッドを使用する必要.Load(id)があります。

LoadACID準拠の操作です。ドキュメント ストアからドキュメントを直接取得します。

Query「結果整合性」のあるBASE操作です。最初にインデックスを検索し、ドキュメント ストアでドキュメントを検索してから返します。Idドキュメントが追加されたばかりで、まだインデックスが作成されていない場合、によるクエリはnull を返す可能性があります。

RavenDB 2.0 では、 によるクエリを防止する機能が追加されましたId。そうしようとすると、例外がスローされます。したがって、使用Loadは単なるベスト プラクティスではなく、要件です。

于 2013-07-24T18:02:30.217 に答える