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 之后有几个 REMOTE
和 GATHER
语句。据我所知,问题源于用于过滤此数据的数据存储和内存结构的分离。
我的问题:这种类型的操作能否在集群上高效完成?
我需要检测过期(待删除)文件,但这显然不是一个可行的方案。
您的查询对现有集合中的每个文档执行一个子查询。每个子查询都需要多次 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)
我有一个比较两个集合并从一侧找到 "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 之后有几个 REMOTE
和 GATHER
语句。据我所知,问题源于用于过滤此数据的数据存储和内存结构的分离。
我的问题:这种类型的操作能否在集群上高效完成?
我需要检测过期(待删除)文件,但这显然不是一个可行的方案。
您的查询对现有集合中的每个文档执行一个子查询。每个子查询都需要多次 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)