[英]ArangoDB - IN operator very slow
我在ArangoDB中使用IN
运算符时遇到一些性能问题。
简而言之,我有一个来自拆分函数的计算(运行时)id数组,我只想获取Collection的选定元素,然后收集或过滤其他数据。
在这里您可以找到AQL查询 :
LET toInclude = SPLIT('Collection/1,Collection/2,Collection/3', ',')
FOR result IN Collection
FILTER result._id IN toInclude
COLLECT property = result.property
WITH COUNT INTO count
return {property, count}
数组toInclude
的元素可以是300000+,查询可以花费10分钟以上来完成工作。
该split
-函数结束在3秒时, property
字段建立索引,所以这个问题是在IN
操作符。
我该怎么做才能解决此演出问题?
非常感谢你!
丹尼尔
我尝试对包含100,000个文档的toInclude
500,000个字符串条目进行查询。
确实需要很长时间才能完成2.7。 执行时间约为4xx秒。 该查询花费大量时间IN
此处评估FILTER
的IN
运算符。 实际上,将为找到的每个文档评估FILTER
条件。 这将与我使用的数据进行大约100,000 x 500,000 / 2比较。
在2.8中,使用相同的数据进行相同的查询大约需要2.7秒,因此该问题似乎没有发生。 2.8中有很多优化程序更改,而导致加速的原因是IN
表达式将直接在索引中求值。 FILTER
将在那里进行优化。
因此,一种解决方案是在ArangoDB 2.8可用时使用它(当前它在beta中)。
另一个解决方法是改进优化程序,以检测IN
的右侧在查询中是const,以便它可以对结果进行排序,并可以使用二分查找(对数而不是线性复杂度)进行IN
。 但这还不可用。
2.7的解决方法是单独计算IN
列表,并将其作为数组插入查询中。 这样, IN
列表将是一个常量值,优化器将能够对其进行预排序,以便可以使用二进制搜索。 但是,这要求在原始查询之前/之前执行SPLIT
操作。
更新 :在2.8中,现在存在一个附加的优化器规则,可以针对上述情况和其他情况对IN
列表值进行预排序。 这使IN
运算符可以使用二进制搜索,它具有对数复杂度,而不是某些情况下的线性复杂度。 此更改将包含在2.8 beta2中。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.