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> 快的主要内容,如果未能解决你的问题,请参考以下文章