我有一个查询,该查询比较两个集合并从一侧查找“丢失”的文档。这两个馆藏(现有馆藏和临时馆藏)都包含约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
子查询节点之后有多个GATHER
和LET matches ...
语句。据我所知,问题源于用于过滤该数据的数据存储和内存结构的分离。
我的问题:可以在集群上有效地进行此类操作吗?
我需要检测过时(要删除)的文档,但这显然不是可行的解决方案。
答案 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)