Arangodb 变量优化规则

Arangodb 变量优化规则,arangodb,Arangodb,我观察到这两种语句在查询性能上存在巨大差异: FOR w IN relatedAffils COLLECT from = w._from, to = w._to INTO agg INSERT { "_from": from, "_to": to, "weight": LENGTH(agg), "fromAff": DOCUMENT(from).affiliation } INTO relatedAffilsAggregated 及 后者所需时间是

我观察到这两种语句在查询性能上存在巨大差异:

FOR w IN relatedAffils
    COLLECT from = w._from, to = w._to INTO agg
    INSERT { "_from": from, "_to": to, "weight": LENGTH(agg), 
       "fromAff": DOCUMENT(from).affiliation
       } INTO relatedAffilsAggregated

后者所需时间是前者的五倍多(200万条记录超过30分钟)。也许这是因为在第二个版本中,我使用了临时变量。也许这是另一个优化规则有意义的地方

另一个例子:

FOR w IN relatedAffilsAggregated

    FILTER DOCUMENT(w._from).country == "deu"
    FILTER DOCUMENT(w._to).affiliation < DOCUMENT(w._from).affiliation

    SORT w.weight DESC

    LIMIT 1000


    RETURN CONCAT( w.weight, ":  (", DOCUMENT(w._from).country, ",", `DOCUMENT(w._to).country, ") ", DOCUMENT(w._from).affiliation, " <----> ", DOCUMENT(w._to).affiliation)`   
相关附加聚合中的w的

筛选文档(w._from).country==“deu”
筛选文档(w.\u至).affiliation<文档(w.\u自).affiliation
按重量说明分类
限制1000
返回CONCAT(w.weight),:(“,DOCUMENT(w.u.from).country,”,“,` DOCUMENT(w.u.to).country,”)”,DOCUMENT(w.u.from).affiliation,“,DOCUMENT(w.u.to.affiliation)`
大约需要30秒,而我在30分钟后使用变量终止了替代方案

FOR w IN relatedAffilsAggregated

    LET fromDoc = DOCUMENT(w._from)
    FILTER fromDoc.country == "deu"

    LET toDoc = DOCUMENT(w._to)
    FILTER fromDoc.affiliation < toDoc.affiliation

    SORT w.weight DESC

    LIMIT 1000

    RETURN CONCAT( w.weight, ":  (", fromDoc.country, ",", toDoc.country, ") ", fromDoc.affiliation, " <----> ", toDoc.affiliation)
相关附加聚合中的w的

LET fromDoc=文件(w._from)
过滤器fromDoc.country==“deu”
让toDoc=文档(w.\U到)
从doc.affiliation
第一个查询将执行比第二个查询少的一个计算

在第一个查询中,
文档(from).affiliation
将与要插入的对象一起计算

在第二个查询中,对
fromDoc
进行了额外的计算,该变量的内容将在查询中带入
INSERT

第二个查询可以通过重写
LET
声明来提高效率,如下所示:

LET fromDoc = DOCUMENT(from).affiliation
只使用
fromDoc
而不是
fromDoc.affiliation
插入
中的
fromDoc.affiliation
。这将把
fromDoc
变量中的数据量从整个文档减少到一个属性

另一件事是,在这两个查询中使用
到agg
是非常昂贵的。
agg
只需要它的长度,因此
INTO
子句可以更改为:

INTO agg = 1
这将再次将
agg
中的数据量减少到一个简单的数字,而不是完整的文档。此语法自2.4版起可用


自动检测上述内容并自动转换查询会很好。可能将多个计算合并为一个计算的转换会有所帮助。

我同意你的意见。不幸的是,由于我试图简化/概括我的示例,它们只能起作用。我将添加另一个执行时间相差悬殊的选项。也许这就更切题了。那么,在需要的地方直接使用文档属性(甚至在多个地方)是否比先将文档存储在LET变量中,然后再重新使用该变量更有效?
INTO agg = 1