【问题标题】:ArangoDB Not Using Index During TraversalArangoDB 在遍历期间不使用索引
【发布时间】:2016-11-03 15:15:57
【问题描述】:

我有一个简单的图遍历查询:

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 集合上的索引来处理结果吗?

谢谢

【问题讨论】:

  • 每个索引的选择性是多少?

标签: arangodb


【解决方案1】:

在 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 中提供。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-25
    • 1970-01-01
    相关资源
    最近更新 更多