2016-11-03 13 views
1

中にインデックスを使用しない:ArangoDB私は、単純なグラフトラバーサルクエリを持ってトラバーサル

FOR e in 0..3 ANY 'Node/5025926' Edge 
FILTER 

e.ModelType == "A.Model" && 
e.TargetType == "A.Target" && 
e.SourceType == "A.Source" 

RETURN e 

「エッジ」エッジコレクションは、そのためには、属性ModelType、TargetTypeのために定義されたハッシュインデックス、のSourceTypeを持っています。実行計画をチェックするとき

、結果は以下のとおりです。実行計画は何のインデックスがクエリを処理するために使用されないことを示していること

Query string: 
FOR e in 0..3 ANY 'Node/5025926' Edge 
FILTER 
e.ModelType == "A.Model" && 
e.TargetType == "A.Target" && 
e.SourceType == "A.Source" 
RETURN e 

Execution plan: 
Id NodeType   Est. Comment 
    1 SingletonNode  1 * ROOT 
    2 TraversalNode  7  - FOR e /* vertex */ IN 0..3 /* min..maxPathDepth */ ANY 'Node/5025926' /* startnode */ Edge 
    3 CalculationNode  7  - LET #1 = (((e.`ModelType` == "A.Model") && (e.`TargetType` == "A.Target")) && (e.`SourceType` == "A.Source")) /* simple expression */ 
    4 FilterNode   7  - FILTER #1 
    5 ReturnNode   7  - RETURN e 

Indexes used: 
none 

Traversals on graphs: 
Id Depth Vertex collections Edge collections Filter conditions 
    2 0..3       Edge    

Optimization rules applied: 
none 

注意してください。

結果を処理するためにエンジンがEdgeコレクションのインデックスを使用するために必要なことはありますか? ArangoDB 3.0で

おかげ

+0

各指標の選択性はどのくらいですか? –

答えて

0

トラバーサルは関係なく、常にフィルタ条件がクエリに存在し、インデックスが存在どちらのうち、接続された頂点を見つけるために、エッジのインデックスを使用します。

ArangoDB 3.1では、オプティマイザはトラバーサルの各レベルで最適なインデックスを見つけようとします。これは、トラバーサルのフィルタ条件を検査し、各レベルについて、最低コストを見積もるためにインデックスを選択します。ユーザ定義のインデックスがない場合でも、エッジインデックスを使用して接続された頂点を検索します。他のインデックスは、エッジ属性にもフィルタ条件があり、それがインデックス付けされ、インデックスがエッジインデックスよりも推定平均選択性が良い場合に使用されます。

3.1.0では、トラバーサルで常に索引が使用されるにもかかわらず、Explain出力ではトラバーサルに対して常に「使用される索引:なし」が表示されます。索引の表示は、Explain出力に欠落しています。これは、ArangoDB 3.1.1で修正されました。これは、トラバーサルの各レベルに対してオプティマイザによって選択された個々のインデックスを表示します。たとえば、次のクエリは、次の3.1で出力を説明し示し

Query string: 
FOR v, e, p in 0..3 ANY 'v/test0' e 
    FILTER p.edges[0].type == 1 && p.edges[2].type == 2 
    RETURN p.vertices 

Execution plan: 
Id NodeType   Est. Comment 
    1 SingletonNode  1 * ROOT 
    2 TraversalNode  8000  - FOR v /* vertex */, p /* paths */ IN 0..3 /* min..maxPathDepth */ ANY 'v/test0' /* startnode */ e 
    3 CalculationNode 8000  - LET #5 = ((p.`edges`[0].`type` == 1) && (p.`edges`[2].`type` == 2)) /* simple expression */ 
    4 FilterNode  8000  - FILTER #5 
    5 CalculationNode 8000  - LET #7 = p.`vertices` /* attribute expression */ 
    6 ReturnNode  8000  - RETURN #7 

Indexes used: 
By Type Collection Unique Sparse Selectivity Fields    Ranges 
    2 edge e   false false  10.00 % [ `_from`, `_to` ] base INBOUND 
    2 edge e   false false  10.00 % [ `_from`, `_to` ] base OUTBOUND 
    2 hash e   false false  63.60 % [ `_to`, `type` ]  level 0 INBOUND 
    2 hash e   false false  64.40 % [ `_from`, `type` ] level 0 OUTBOUND 
    2 hash e   false false  63.60 % [ `_to`, `type` ]  level 2 INBOUND 
    2 hash e   false false  64.40 % [ `_from`, `type` ] level 2 OUTBOUND 

追加のインデックスは、[ "_to", "type" ][ "_from", "type" ]上に存在します。それらは、これらのインデックスを使用できるこれらのレベルのエッジのフィルタ条件が存在するため、トラバーサルのレベル0と2で使用されます。他のすべてのレベルでは、「範囲」列に「ベース」というラベルが付けられたインデックスが使用されます。

説明出力の修正は、すぐにリリースされる3.1.1で使用可能になります。

関連する問題