在 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 行),查找索引匹配的主要限定符是一组规范化的字段,由查询。