我有一个简单的图遍历查询:
FOR e in 0..3 ANY 'Node/5025926' Edge
FILTER
e.ModelType == "A.Model" &&
e.TargetType == "A.Target" &&
e.SourceType == "A.Source"
RETURN e
“Edge”边集合具有按顺序为属性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集合上的索引来处理结果吗?
谢谢
1 回答
在ArangoDB 3.0中,遍历将始终使用边索引来查找连接的顶点,无论查询中存在哪些过滤条件,也不管存在哪些索引 .
在ArangoDB 3.1中,优化器将尝试为每个遍历级别找到最佳索引 . 它将检查遍历的过滤条件,并为每个级别选择估计最低成本的索引 . 如果没有用户定义的索引,它仍将使用边索引来查找连接的顶点 . 如果边缘属性上存在过滤条件,并且索引具有比边缘索引更好的估计平均选择性,则将使用其他索引 .
在3.1.0中,解释输出将始终显示“使用的索引:无”用于遍历,即使遍历将始终使用索引 . 解释输出中缺少索引显示 . 这已在ArangoDB 3.1.1中修复,它将显示优化程序为每个遍历级别选择的各个索引 .
例如,以下查询显示3.1中的以下解释输出:
[ "_to", "type" ]
和[ "_from", "type" ]
上还有其他索引 . 这些用于遍历的级别0和级别2,因为这些级别上的边缘存在可以使用这些索引的过滤条件 . 对于所有其他级别,遍历将使用"Ranges"列中标有"base"的索引 .解释输出修复程序将随3.1.1一起提供,将很快发布 .