ArangoDB - 集群中查询性能慢

3

我有一个查询,可以比较两个集合,并找到一侧缺失的文档。这两个集合(现有和临时)都包含约25万个文档。

FOR existing IN ExistingCollection
    LET matches = (
        FOR temp IN TempCollection
            FILTER temp._key == existing._key
            RETURN true
    )
    FILTER LENGTH(matches) == 0
    RETURN existing

当在单服务器环境中运行时(DB和Foxx在同一服务器/容器上),此操作仅需不到0.5秒即可完成。
然而,当我在集群中运行此操作(单个DB,单个Coordinator),即使DB和Coord在同一物理主机上(不同的容器),我仍需要在初始的“FOR existing…”之后添加“LIMIT 1000”以防止超时!尽管如此,这种被限制的结果也需要近7秒才能返回!
从执行计划来看,我发现在“LET matches…”子查询节点之后有几个“REMOTE”和“GATHER”语句。据我所知,问题源于用于过滤此数据的数据存储和内存结构的分离。
我的问题是:在集群上可以高效地完成此类操作吗?
我需要检测过时(即将删除)的文档,但这显然不是可行的解决方案。
1个回答

0

您的查询针对现有集合中的每个文档执行一个子查询。每个子查询都需要进行多次HTTP往返以进行设置、实际查询和关闭。

您可以使用以下查询避免子查询。它将所有文档的_key加载到RAM中 - 但是对于您相对较小的集合来说,这应该不是问题。

LET ExistingCollection = (FOR existing IN c2 RETURN existing._key)
LET TempCollection = (FOR temp IN c1 RETURN temp._key)
RETURN MINUS(ExistingCollection, TempCollection)

太好了!我不确定我是怎么错过MINUS()函数的,但这正是我需要的。谢谢! - kerry

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接