如何解决ArangoDB Foxx死锁问题?

时间:2017-04-04 20:41:50

标签: arangodb foxx

在测试中,我们的Foxx应用程序正在进入"检测到死锁"问题。这些似乎是由遍历查询引起的。 Apriori,如果不是不可能知道在遍历期间将使用哪些表是困难的。但是,我确实采用了一个特定的案例,我可以确定表的数量并将AQL包装在事务中进行测试:

var result = db._executeTransaction({" collections":{" read":[" pmlibrary"," pmvartype",& #34; pmvariant"," pmproject"," pmsite"," pmpath"," pmattic"]}," action":" function(){var db = require(\" @arangodb \")。db; var res = db._query(\" FOR o IN [ ' pmlibrary / 199340787'] FOR v,e,p IN 0..7 INBOUND o pm_child RETURN p.vertices \"); return res.toArray()}"});

仅供参考,集合中的表列表不包括边表。

然而,此声明的僵局仍在继续。我不确定下一步该尝试什么。感谢。

2 个答案:

答案 0 :(得分:1)

我不是ArangoDB的索引/性能专家,但我最近也遇到了一些死锁问题,通过重构和重新整形查询获得了巨大的性能提升,有时查询花了120秒然后花了0.2秒。 / p>

我做的一件事是尝试帮助ArangoDB知道何时使用索引,并确保索引可供使用。

在您的示例查询中,存在阻止ArangoDB知道索引发生的问题:

FOR o IN ['pmlibrary/199340787'] 
FOR v,e,p IN 0..7 INBOUND o pm_child 
  RETURN p.vertices

这个问题的关键是你的原始FOR循环使用了数组中的值,这可能会阻碍ArangoDB识别索引。您可以使用参数轻松替换o,并直接输入'pmlibrary/199340787'值,并使用Explain按钮查看它是否标识它可以使用索引。

我发现的一个问题是尝试使用索引非常清楚,这有时意味着添加额外的LET命令以允许ArangoDB构建数组的内容,然后它似乎知道要使用什么索引更好。

如果您要测试上述查询的性能,请执行以下操作:

LET my_targets = (FOR o IN pmlibrary FILTER o._key == '199340787' RETURN o._id)

FOR o IN my_targets
FOR v,e,p IN 0..7 INBOUND o._id pm_child 
  RETURN p.vertices

这可能看似违反直觉,但通过测试,我发现通过打破查询以帮助ArangoDB注意它可以使用索引来获得惊人的性能提升。

如果任何查询都违反了数组中的值,或者您使用的是动态属性名称,那么即使存在索引,它也不会总是使用索引。

此外,我发现服务器将缓存查询的响应,因此如果您要测试对长时间运行的查询的更改并希望避免第二次+查询的缓存命中,我必须停止并重新启动arangodb3服务。 / p>

我希望这有助于为您提供一个目标,让您可以随意改变查询以使用索引。

请记住,您已经在_id,_key,_from,_to上有内置索引,因此您需要尝试确保它将使用其他索引来帮助加快查询速度。

答案 1 :(得分:1)

正确的解决方案是使用WITH子句而不是事务。