在RavenDb中,是泛型session会机会使用的静态索引.Query <tdoctype>调用

时间:2016-09-06 18:47:54

标签: c# ravendb

所以,我在我的应用程序中有查询,并意识到一些查询始终处于更高的负载下。特别是,增加客户端订阅经常发生(尽管可能不在上午8:00和下午5:00之外)。

我有一个文档类型

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 == ...);

我的问题是,&lt; AggregateSubscription&gt;的通用查询使用AggregateId属性中的Where子句会自动使用此静态索引吗? e.g。

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的查询实现或策略可以让我知道对静态索引的期望是多少。

或者,如果你能指出我可以看到索引用法的统计数据,我可以凭经验检查结果。我所看到的只是处理索引的统计信息,而不是查询实际使用的索引。

编辑1:在问题

周围添加了上下文

编辑2: 我找到了一些有希望的证据。 在构建查询IRavenQueryable<T>时,它会显示query.IndexQueried = "dynamic/AggregateSubscriptions"。但是那个客户端。

执行查询后,统计信息显示RavenQueryStatistics.IndexName = AggregateSubscription/ByAggregateId。 所以看起来ravendb服务器端确实使用静态索引(如果存在)。 我会回答我自己的问题,但是如果有人能够回答我原来的问题(ravendb实现细节,整体策略或索引查询使用统计数据,如Raven Studio),我可以接受。

1 个答案:

答案 0 :(得分:1)

根据经验,我能够证明,尽管在客户端,索引名称显示它使用的是动态查询,但查询后服务器返回的RavenQueryStatistics显示最终找到了匹配项使用静态索引。

此外,在github上挖掘ravendb的源代码,我能够找到实施此策略的地方,: 方法public DynamicQueryOptimizerResult SelectAppropriateIndex(...

https://github.com/ravendb/ravendb/blob/v3.0/Raven.Database/Queries/DynamicQueryOptimizer.cs#L50

在确定潜在的索引匹配(第91-336行)时会变得很毛茸茸,但即使只是查看设置(第64-75行),查找索引匹配的主要限定符也是查询使用的规范化字段集。