ArangoDB-集群上的查询性能降低

时间:2018-12-29 01:56:02

标签: arangodb

我有一个查询,该查询比较两个集合并从一侧查找“丢失”的文档。这两个馆藏(现有馆藏和临时馆藏)都包含约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在同一物理主机(不同的容器)上,我也必须在初始位置之后添加一个LIMIT 1000 FOR existing ...,以防止其超时!尽管如此,这个有限的结果仍会在将近7秒钟内返回!

查看执行计划,我发现在REMOTE子查询节点之后有多个GATHERLET matches ...语句。据我所知,问题源于用于过滤该数据的数据存储和内存结构的分离。

我的问题:可以在集群上有效地进行此类操作吗?

我需要检测过时(要删除)的文档,但这显然不是可行的解决方案。

1 个答案:

答案 0 :(得分: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)
相关问题