ArangoDB社区版如何并行执行两个AQL查询?
在ArangoDB社区版中并行执行AQL查询的可行性与实现方法
可行,ArangoDB社区版支持并行执行多个AQL查询逻辑,无需按顺序运行。下面是具体实现方式和优化思路:
1. 用PARALLEL关键字实现并行执行
你可以把两个查询包装成子查询,放到PARALLEL的数组参数中,ArangoDB会自动并行处理这些子查询,而非按顺序执行。示例代码如下:
RETURN PARALLEL([ // 统计转入交易数据 (FOR d IN Transaction FILTER d._to == "Account/123" COLLECT AGGREGATE length = COUNT_UNIQUE(d._id), totamnt = SUM(d.Amount), daysactive = COUNT_UNIQUE(DATE_TRUNC(d.Time, "day")) RETURN { "Incoming Accounts": length , "Days Active": LENGTH(daysactive), "Total Amount": totamnt }), // 统计转出交易数据 (FOR d IN Transaction FILTER d._from == "Account/123" COLLECT AGGREGATE length = COUNT_UNIQUE(d._id), totamnt = SUM(d.Amount), daysactive = COUNT_UNIQUE(DATE_TRUNC(d.Time, "day")) RETURN { "Outgoing Accounts": length , "Days Active": LENGTH(daysactive), "Total Amount": totamnt }) ])
PARALLEL会并行执行数组内的每个子查询,最终返回包含两个查询结果的数组。
2. 更高效的优化方案:单次扫描集合
虽然并行执行能提升速度,但两次扫描Transaction集合会浪费资源。推荐改成一次扫描集合,同时统计转入和转出的数据,效率更高:
FOR d IN Transaction FILTER d._to == "Account/123" || d._from == "Account/123" COLLECT transactionType = d._to == "Account/123" ? "Incoming" : "Outgoing" AGGREGATE uniqueCount = COUNT_UNIQUE(d._id), totalAmount = SUM(d.Amount), activeDays = COUNT_UNIQUE(DATE_TRUNC(d.Time, "day")) RETURN { [transactionType + " Accounts"]: uniqueCount, "Days Active": LENGTH(activeDays), "Total Amount": totalAmount }
这种方式只遍历一次集合,通过COLLECT按交易类型分组统计,在大数据集场景下性能优势更明显。
内容的提问来源于stack exchange,提问作者Chaitanya Srinevas
相关产品推荐
相关产品推荐

