2016-09-06 12 views
1

私のアプリケーションではクエリがあり、より高い負荷で一貫してクエリが実行されていました。特に、クライアントの加入数を増やすことは頻繁に行われます(おそらく、午前8時と午後5時の時間外ではありません)。RavenDbでは、ジェネリックセッションで便宜的に使用される静的インデックスがあります。クエリ<TDocType>

私はドキュメントタイプ

public class AggregateSubscription 
{ 
    public Guid UserId {get; set;} 
    public Guid AggregateId {get; set;} 
    ...other fields 
} 

を持っていると私は私が私ができる知っているこのインデックス

var results = session.Query<AggregateSubscription, AggregateSubscription_ByAggregateId>() 
    .Where(x => x.AggregateId == ...); 

私の質問を使用して照会する、今すぐインデックス

public class AggregateSubscription_ByAggregateId : AbstractIndexCreationTask<AggregateSubscription> 
{ 
    public AggregateSubscription_ByAggregateId() 
    { 
     Map = docs => from d in docs select new { d.AggregateId }; 
    } 
} 

を追加しましたは、<AggregateSubscription>の汎用クエリで、Where句はth e AggregateIdプロパティは自動的にこの静的インデックスを使用しますか?例: インデックスを追加した後

var results = session.Query<AggregateSubscription>() 
    .Where(x => x.AggregateId == ...); //will this detect that it can use _ByAggregateId index and use it? 

Luceneの構文にどこフィールドをスライスし、ダイシングの際に、私は本当にravendbのクエリエンジンの場合と同様に、一致する静的なインデックスがあります検出し、それを利用することになるでしょう。 ドキュメントからは、ダイナミックインデックスがこのように動作するように見えます(同じ形のクエリは同じダイナミックインデックスに解決されます)が、上記の静的インデックスを持つシナリオのサポートがあるかどうかはわかりません。

私は、ravendbのクエリの実装や戦略に精通している人が、静的インデックスの期待値を教えてくれることを期待しています。

また、インデックスの使用方法の統計情報を経験的に確認することができます。私が見るのは、実際にはクエリで使用されているインデックスではなく、インデックスの統計を処理することだけです。

編集1:質問の周りに追加のコンテキスト

編集2: 私はいくつかの有望な証拠を見つけました。 クエリIRavenQueryable<T>を作成すると、query.IndexQueried = "dynamic/AggregateSubscriptions"が表示されます。しかしそれはクライアント側です。

クエリを実行すると、統計情報はRavenQueryStatistics.IndexName = AggregateSubscription/ByAggregateIdと表示されます。 ravendbサーバー側は実際に静的インデックスが存在する場合はそれを利用しているようです。 誰かが私の元の質問(ravendbの実装の詳細、全体的な戦略、またはRaven Studioのようなものを介したインデックスクエリの使用状況)に答えることができるならば、私は自分自身の質問に答えます。

答えて

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行目)、インデックス一致を見つけるための主要な修飾子は、クエリによって使用されるフィールドの正規化されたセットです。

関連する問題