[英]How to resolve ArangoDB Foxx deadlocking problems?
在测试中,我们的Foxx应用正在陷入“检测到死锁”的问题。 这些似乎是由遍历查询引起的。 先验的,很难甚至不是不可能知道遍历期间将使用哪些表。 但是,我确实采用了一种特定的情况,即可以确定表的数量并将AQL包装在用于测试的事务中:
var result = db._executeTransaction({“ collections”:{“ read”:[“ pmlibrary”,“ pmvartype”,“ pmvariant”,“ pmproject”,“ pmsite”,“ pmpath”,“ pmattic”]},“操作“:” 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返回p.vertices \\“);返回res.toArray()}”});
仅供参考,集合中的表列表不包括边缘表。
但是,此语句上的僵局仍在继续。 我不确定接下来要尝试什么。 谢谢。
我不是ArangoDB的索引/性能专家,但最近我也遇到了一些死锁问题,通过重构和重塑查询可以显着提高性能,有时查询花费120秒,然后花费0.2秒。
我做的关键一件事是尝试帮助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服务。
我希望这可以为您提供一个针对查询进行改组以使用索引的目标。
请记住,您已经在_id,_key,_from,_to上建立了内置索引,因此您需要尝试确保它将使用其他有助于加快查询速度的索引。
正确的解决方案是使用WITH子句而不是事务。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.