所以,我在我的应用程序中有查询,并意识到一些查询始终处于更高的负载下。特别是,增加客户端订阅经常发生(尽管可能不在上午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),我可以接受。
答案 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行),查找索引匹配的主要限定符也是查询使用的规范化字段集。