ArangoDB完全收集扫描并加入

ArangoDB完全收集扫描并加入,arangodb,aql,Arangodb,Aql,当我尝试在ArangoDB中仅使用一个筛选器执行内部联接时,如下所示: FOR doc1 in catalogue FOR doc2 in RepoNodes FOR doc3 in RepoEdges FOR doc4 in RepoNodes FOR doc5 in RepoEdges FOR doc6 in RepoNodes FOR doc10 in catalogue FOR doc11 in simila

当我尝试在ArangoDB中仅使用一个筛选器执行内部联接时,如下所示:

FOR doc1 in catalogue
FOR doc2 in RepoNodes
 FOR doc3 in RepoEdges
 FOR doc4 in RepoNodes
   FOR doc5 in RepoEdges
          FOR doc6 in RepoNodes
            FOR doc10 in catalogue
             FOR doc11 in similarities
              FOR doc12 in clearance

 FILTER doc1.trackid== "TRAAAAK128F9318786" AND doc1.trackid==doc2.mongodbsongs
AND doc3._from==doc2._id AND doc3._to ==doc4._id AND doc5._from==doc4._id and    doc6._id ==doc5._to
AND   doc10.trackid== doc6.mongodbsongs
AND doc11._from==CONCAT("Tracks/",doc6.neo4jSong)
AND doc6.redisclearance== doc12._key
         return {doc10,doc11,doc12}
我注意到索引被忽略了。。我是说。。它执行完整的集合扫描。 如果我序列化了同一个查询,它就可以完美地工作。 我不明白为什么。。 如果我在最后4点之前停下来,没关系。。 问题在哪里?为什么需要完整的集合扫描?

n对于后一个查询(不使用索引的查询),查询优化器执行一个函数,该函数将在查询中移动FOR循环。它将尝试创建不改变查询含义的FOR循环的所有可能排列

在后一个查询中,优化器可以自由地在9个FOR循环中的任意一个循环中移动,因为它们之间没有可能出现问题的筛选语句。在这里,优化器将开始创建新的执行计划,并移动FOR循环。这可以创造9个!(例如362880)不同的执行计划,但默认情况下,优化器停止在192个计划,以避免组合爆炸。当达到计划的数量时,优化器将停止应用一些进一步的优化,以限制整个优化运行时

这就是为什么在第二个查询中,EnumerateCollectionNodes没有转换为IndexNodes的原因。优化器在此步骤之前已停止,因为已经有太多的执行计划

在第一个查询中,优化器不能在FOR循环中自由移动,因为FILTER语句限制了一些移动。正因为如此,它不会生成那么多执行计划,也不会过早停止优化


3.0.2版包含了此问题的修复程序。在此之前的一个临时解决方法是将第二个查询中的一个FILTER语句拆分为多个较小的FILTER语句,并将它们移动到各自的FOR循环附近。

3.0.2版本可下载,其中包含上述修复程序。您能否重试并将答案标记为已接受?