ArangoDB 2.8 - 按子查询结果排序 - 失败
ArangoDB 2.8 - sort by subquery result - failure
移动到 2.8 后,这个简单的查询现在冻结了服务器,使用率为 100% CPU ~10 秒。在 2.7(~30 毫秒)
FOR P In Person
LET EventLast = (
FOR E In Event FILTER E.owner == P._id SORT E.date desc LIMIT 1 RETURN E.date
)
SORT EventLast[0]
LIMIT 40
RETURN { _id: P._id, name:P.name }
Collection 事件在 date
中有跳过列表索引,在 owner
中有哈希索引
没有 "SORT E.date desc" 或 "SORT EventLast[0]" - 1 毫秒
2.8-beta 中的查询优化器为内部子查询选择了 date
上的跳过列表索引。该索引允许删除 SORT
子句,但内部查询仍然需要以相反的顺序扫描整个索引,直到第一个过滤器匹配。它执行的次数与 Person
.
中的文档一样多
2.7 优化器改为选择 owner
上的哈希索引并使用 post-index-SORT
。在这种情况下,如果每次索引查找的匹配数非常少,这可能会更好,但如果过滤器非常没有选择性,则效果会很差。
2.8 优化器现在将再次首选内部查询可能更具选择性的哈希索引。今天在 2.8
分支中对此进行了修复,它将变成 beta3 或 rc(请注意,很快会有一个 beta2 尚未包含修复)。
移动到 2.8 后,这个简单的查询现在冻结了服务器,使用率为 100% CPU ~10 秒。在 2.7(~30 毫秒)
FOR P In Person
LET EventLast = (
FOR E In Event FILTER E.owner == P._id SORT E.date desc LIMIT 1 RETURN E.date
)
SORT EventLast[0]
LIMIT 40
RETURN { _id: P._id, name:P.name }
Collection 事件在 date
中有跳过列表索引,在 owner
没有 "SORT E.date desc" 或 "SORT EventLast[0]" - 1 毫秒
2.8-beta 中的查询优化器为内部子查询选择了 date
上的跳过列表索引。该索引允许删除 SORT
子句,但内部查询仍然需要以相反的顺序扫描整个索引,直到第一个过滤器匹配。它执行的次数与 Person
.
2.7 优化器改为选择 owner
上的哈希索引并使用 post-index-SORT
。在这种情况下,如果每次索引查找的匹配数非常少,这可能会更好,但如果过滤器非常没有选择性,则效果会很差。
2.8 优化器现在将再次首选内部查询可能更具选择性的哈希索引。今天在 2.8
分支中对此进行了修复,它将变成 beta3 或 rc(请注意,很快会有一个 beta2 尚未包含修复)。