• Presto RBO之 Sort算子优化


    一. 前言

         本文主要介绍在Presto中部分与Sort(order by)相关的RBO优化。

    二. MergeLimitWithSort规则

           MergeLimitWithSort的作用主要将Limit + OrderBy 算子转化为TopN算子,如下图的执行计划所示:

         MergeLimitWithSort的实现代码也非常简单,主要是将Limit+OrderBy的Node替换成TopN的Node即可。

    三. MergeLimitOverProjectWithSort规则

            MergeLimitOverProjectWithSort 的作用是将Limit-Project-Sort的算子转化成Project-TopN的算子的形式,如下所示:

           MergeLimitOverProjectWithSort的代码实现过程主要通过将Project的Source替换成一个TopN Node,其中N为Limit的数量,排序列为Sort的排序列。

    四. RemoveRedundantSort规则

           RemoveRedundantSort 主要作用是去除只有1条结果或者0 条结果的Sort。如下执行计划中,order by 1是order by就只会有一条结果,因此Sort算子可以裁剪掉。

     其代码实现过程如下所示:

    1. public Result apply(SortNode node, Captures captures, Context context)
    2. {
    3. // 如果sort的source无结果的话,则将整个执行计划都裁掉
    4. if (isAtMost(node.getSource(), context.getLookup(), 0)) {
    5. return Result.ofPlanNode(new ValuesNode(node.getId(), node.getOutputSymbols(), ImmutableList.of()));
    6. }
    7. // 如果只有一条结果的话,直接裁掉Sort算子
    8. if (isScalar(node.getSource(), context.getLookup())) {
    9. return Result.ofPlanNode(node.getSource());
    10. }
    11. return Result.empty();
    12. }

    五. PruneOrderByInAggregation规则

              PruneOrderByInAggregation 主要作用是裁剪掉聚合函数内部的sort算子。如下执行计划所示,sum(id order by id)中的order by无意义,因此可以裁剪掉。

       其代码实现的过程如下所示:

    1. public Result apply(AggregationNode node, Captures captures, Context context)
    2. {
    3. ......
    4. for (Map.Entry<Symbol, Aggregation> entry : node.getAggregations().entrySet()) {
    5. Aggregation aggregation = entry.getValue();
    6. // 聚合操作中无sort操作,不做处理
    7. if (!aggregation.getOrderingScheme().isPresent()) {
    8. aggregations.put(entry);
    9. }
    10. // getAggregateFunctionImplementation can be expensive, so check it last.
    11. else if (metadata.getFunctionAndTypeManager().getAggregateFunctionImplementation(aggregation.getFunctionHandle()).isOrderSensitive()) {
    12. aggregations.put(entry);
    13. }
    14. // 聚合操作中无sort操作,裁剪掉sort算子
    15. else {
    16. anyRewritten = true;
    17. aggregations.put(entry.getKey(), new Aggregation(
    18. aggregation.getFunctionCall(),
    19. aggregation.getArguments(),
    20. aggregation.isDistinct(),
    21. aggregation.getFilter(),
    22. Optional.empty(), // 裁剪sort算子的地方
    23. aggregation.getMask()));
    24. }
    25. }
    26. ......
    27. }
  • 相关阅读:
    AI虚拟人物 数字人直播,不用出镜,不用露脸的直播方式(附教程 软件)
    Ubuntu下putty 复制粘贴
    微信销售技巧和话术
    如何拿到BAT面试offer的?全靠这份附精华宝典+求职秘籍,查漏补缺!
    Leetcode3200. 三角形的最大高度
    java多线程的简单应用
    首都博物京韵展,监测系统实现文物科技保护
    Oracle-数据库对象的使用
    布局与打包
    NodeJS Session&Token验证⑧
  • 原文地址:https://blog.csdn.net/wangfeihuo/article/details/127698731