ArangoDB - 集群查询性能缓慢

ArangoDB - Slow query performance on cluster

我有一个比较两个集合并从一侧找到 "missing" 文档的查询。两个集合(现有的和临时的)都包含大约 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 在同一个 server/container 上)时,这 运行 在 0.5 秒内就像闪电一样。

然而,当我运行在集群中(单个数据库,单个协调器)时,即使数据库和协调器位于同一物理主机(不同容器)上,我也必须添加一个LIMIT 1000 在最初的 FOR existing ... 之后以防止它超时!尽管如此,这个有限的结果 returns 只用了将近 7 秒!

查看执行计划,我看到 LET matches ... SubqueryNode 之后有几个 REMOTEGATHER 语句。据我所知,问题源于用于过滤此数据的数据存储和内存结构的分离。

我的问题:这种类型的操作能否在集群上高效完成?

我需要检测过期(待删除)文件,但这显然不是一个可行的方案。

您的查询对现有集合中的每个文档执行一个子查询。每个子查询都需要多次 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)