如何解决ArangoDB Foxx死锁问题?



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

var result = db._executeTransaction({ "collections" : { "read" : [ "pmlibrary", "pmvartype", "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()}" });

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

然而,这一声明的僵局仍在继续。 我不确定接下来要尝试什么。 谢谢。

我不是 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'值,并使用"解释"按钮查看它是否标识它可以使用索引。

我发现的一个问题是试图让使用索引变得非常清晰,这有时意味着添加额外的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 注意到它可以使用索引,从而获得了惊人的性能提升。

如果任何查询针对 Array 中的值,或者如果您使用的是动态属性名称,则即使存在索引,它也不会始终使用索引。

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

我希望这有助于为您提供一个目标,以便围绕查询进行随机排序以使用索引。

请记住,您已经在_id、_key、_from_to上建立了内置索引,因此您需要尝试并确保它将使用其他有助于加快查询速度的索引。

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

最新更新