在 RavenDb 中,静态索引是否被通用 session.Query<TDocType> 调用机会性地使用
In RavenDb, are static indexes opportunistically used by generic session.Query<TDocType> calls
所以,我在我的应用程序中有查询,并意识到一些查询一直处于更高的负载下。特别是,增加客户端订阅经常发生(尽管,可能不会在 8:00am 和 5:00pm 的时间之外)。
我有一个文档类型
public class AggregateSubscription
{
public Guid UserId {get; set;}
public Guid AggregateId {get; set;}
...other fields
}
并且我添加了一个索引
public class AggregateSubscription_ByAggregateId : AbstractIndexCreationTask<AggregateSubscription>
{
public AggregateSubscription_ByAggregateId()
{
Map = docs => from d in docs select new { d.AggregateId };
}
}
现在,我知道我可以使用这个索引进行查询
var results = session.Query<AggregateSubscription, AggregateSubscription_ByAggregateId>()
.Where(x => x.AggregateId == ...);
我的问题是,在 AggregateId 属性 上带有 Where 子句的 的通用查询会自动使用此静态索引吗?
例如
var results = session.Query<AggregateSubscription>()
.Where(x => x.AggregateId == ...); //will this detect that it can use _ByAggregateId index and use it?
添加索引后,我真的很希望 ravendb 的查询引擎在将 Where 字段切片和切块为 lucene 语法时,会检测到有一个匹配的静态索引,并利用它。
从文档来看,动态索引似乎以这种方式工作(相同形状的查询解析为相同的动态索引),但我不知道是否支持我上面描述的静态索引的场景。
我希望熟悉 ravendb 的查询实现或策略的人可以让我知道静态索引的期望值。
或者,如果您能指出我在哪里可以看到索引 usage 统计信息,我可以凭经验检查结果。我所看到的只是处理索引的统计信息,而不是查询实际使用的索引。
编辑 1:添加了问题的上下文
编辑 2:
我发现了一些有希望的证据。
在构造查询 IRavenQueryable<T>
时,它显示 query.IndexQueried = "dynamic/AggregateSubscriptions"
。但那是客户端。
执行查询后,统计信息显示 RavenQueryStatistics.IndexName = AggregateSubscription/ByAggregateId
。
所以看起来 ravendb 服务器端实际上确实使用了静态索引(如果存在的话)。
我会回答我自己的问题,但我愿意接受是否有人可以回答我原来的问题(ravendb 实施细节、总体策略或通过 Raven Studio 之类的索引查询使用统计信息)
根据经验,我能够证明,虽然在客户端,索引名称显示它正在使用动态查询,但服务器在查询后返回的 RavenQueryStatistics
显示它最终找到了匹配项并且使用静态索引。
此外,在 github 上深入研究 ravendb 的源代码,我能够找到实施该策略的位置,:
方法 public DynamicQueryOptimizerResult SelectAppropriateIndex(...
https://github.com/ravendb/ravendb/blob/v3.0/Raven.Database/Queries/DynamicQueryOptimizer.cs#L50
在限定潜在索引匹配(第 91-336 行)时,它变得非常复杂,但即使只看设置(第 64-75 行),查找索引匹配的主要限定符是一组规范化的字段,由查询。
所以,我在我的应用程序中有查询,并意识到一些查询一直处于更高的负载下。特别是,增加客户端订阅经常发生(尽管,可能不会在 8:00am 和 5:00pm 的时间之外)。
我有一个文档类型
public class AggregateSubscription
{
public Guid UserId {get; set;}
public Guid AggregateId {get; set;}
...other fields
}
并且我添加了一个索引
public class AggregateSubscription_ByAggregateId : AbstractIndexCreationTask<AggregateSubscription>
{
public AggregateSubscription_ByAggregateId()
{
Map = docs => from d in docs select new { d.AggregateId };
}
}
现在,我知道我可以使用这个索引进行查询
var results = session.Query<AggregateSubscription, AggregateSubscription_ByAggregateId>()
.Where(x => x.AggregateId == ...);
我的问题是,在 AggregateId 属性 上带有 Where 子句的
var results = session.Query<AggregateSubscription>()
.Where(x => x.AggregateId == ...); //will this detect that it can use _ByAggregateId index and use it?
添加索引后,我真的很希望 ravendb 的查询引擎在将 Where 字段切片和切块为 lucene 语法时,会检测到有一个匹配的静态索引,并利用它。 从文档来看,动态索引似乎以这种方式工作(相同形状的查询解析为相同的动态索引),但我不知道是否支持我上面描述的静态索引的场景。
我希望熟悉 ravendb 的查询实现或策略的人可以让我知道静态索引的期望值。
或者,如果您能指出我在哪里可以看到索引 usage 统计信息,我可以凭经验检查结果。我所看到的只是处理索引的统计信息,而不是查询实际使用的索引。
编辑 1:添加了问题的上下文
编辑 2:
我发现了一些有希望的证据。
在构造查询 IRavenQueryable<T>
时,它显示 query.IndexQueried = "dynamic/AggregateSubscriptions"
。但那是客户端。
执行查询后,统计信息显示 RavenQueryStatistics.IndexName = AggregateSubscription/ByAggregateId
。
所以看起来 ravendb 服务器端实际上确实使用了静态索引(如果存在的话)。
我会回答我自己的问题,但我愿意接受是否有人可以回答我原来的问题(ravendb 实施细节、总体策略或通过 Raven Studio 之类的索引查询使用统计信息)
根据经验,我能够证明,虽然在客户端,索引名称显示它正在使用动态查询,但服务器在查询后返回的 RavenQueryStatistics
显示它最终找到了匹配项并且使用静态索引。
此外,在 github 上深入研究 ravendb 的源代码,我能够找到实施该策略的位置,:
方法 public DynamicQueryOptimizerResult SelectAppropriateIndex(...
https://github.com/ravendb/ravendb/blob/v3.0/Raven.Database/Queries/DynamicQueryOptimizer.cs#L50
在限定潜在索引匹配(第 91-336 行)时,它变得非常复杂,但即使只看设置(第 64-75 行),查找索引匹配的主要限定符是一组规范化的字段,由查询。