在测试中,我们的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()}"});
仅供参考,集合中的表列表不包括边表。
然而,此声明的僵局仍在继续。我不确定下一步该尝试什么。感谢。
答案 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子句而不是事务。