我有一个简单的图遍历查询:
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'边缘集合具有为该属性ModelType,TargetType,SourceType定义的哈希索引。
检查执行计划时,结果为:
{{1}}
请注意,执行计划表明不会使用任何索引来处理查询。
我是否需要做任何事情才能让引擎使用Edge集合上的索引来处理结果?
由于
答案 0 :(得分:0)
在ArangoDB 3.0中,遍历将始终使用边索引来查找连接的顶点,无论查询中存在哪些过滤条件,也不管存在哪些索引。
在ArangoDB 3.1中,优化器将尝试为每个遍历级别找到最佳索引。它将检查遍历的过滤条件,并为每个级别选择它估计最低成本的索引。如果没有用户定义的索引,它仍将使用边索引来查找连接的顶点。如果边缘属性上存在过滤条件,并且索引的索引具有比边缘索引更好的估计平均选择性,则将使用其他索引。
在3.1.0中,解释输出将始终显示"使用的索引:无"对于遍历,即使遍历将始终使用索引。解释输出中缺少索引显示。这已在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,因为这些级别上的边缘存在可以使用这些索引的过滤条件。对于所有其他级别,遍历将使用标记为" base"的索引。在"范围"列。
解释输出修正将随3.1.1一起提供,将很快发布。