RavenDB Query<T> 总是比 Load<T> 快

Posted

技术标签:

【中文标题】RavenDB Query<T> 总是比 Load<T> 快【英文标题】:RavenDB Query<T> Always Faster Than Load<T> 【发布时间】:2013-07-05 07:08:02 【问题描述】:

在 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。错了吗?

【问题讨论】:

RavenDB 2.0+ 不会允许您查询 id。因此,这不仅是最佳实践,还是一项要求。 @MattJohnson 如果您想添加它作为答案,我会选择它。我实际上想过删除这个问题,但显然其他人也有同样的问题。也许这没有彻底记录。无论如何。 【参考方案1】:

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

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

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

【讨论】:

您的回答是有道理的,并且是我的假设,但是 RavenDB 网站上的“当您知道文档 ID 时使用加载而不是查询”让我相信我做错了。【参考方案2】:

当通过Id 检索项目时,要求使用.Load(id) 方法。

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

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

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

【讨论】:

以上是关于RavenDB Query<T> 总是比 Load<T> 快的主要内容,如果未能解决你的问题,请参考以下文章

RavenDB 全文搜索

返回查询结果的异步流

QT query.exec() 总是返回 false

xamarin.android 的 Sqlite Query<T> 的正确语法

#yyds干货盘点#RavenDB起步--客户端API

RavenDB 会话 > 30