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-ravenb。提示#4。这是错的吗?

4

2 回答 2

5

据我了解, Load 将保证返回结果(前提是数据库中存在 id),而如果索引尚未更新,则 Query 可能不会返回结果。

您可能会遇到这样一种情况,即您插入一条记录,然后在下一行尝试使用 Query 检索相同的记录,然后什么也得不到。在这种情况下,Load 会返回一条记录。

因此,我猜您看到的性能下降可能与您在使用 Query 时按索引查询的事实有关,而 Load 正在访问实际的数据存储。

于 2013-07-05T07:49:34.740 回答
4

当通过它检索一个项目时Id,您需要使用该.Load(id)方法。

Load是符合ACID的操作。它直接从文档存储中检索文档。

Query是“最终一致”的BASE操作。它首先针对索引,在文档存储中查找文档,然后返回它们。Id如果文档刚刚添加并且尚未被索引,则通过 an 查询可能会返回 null。

RavenDB 2.0 添加了一项功能,以防止您通过Id. 如果您尝试这样做,它将引发异常。因此,使用Load不仅是一种最佳实践,也是一种要求。

于 2013-07-24T18:02:30.217 回答