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算子可以裁剪掉。
其代码实现过程如下所示:
public Result apply(SortNode node, Captures captures, Context context)
{// 如果sort的source无结果的话,则将整个执行计划都裁掉if (isAtMost(node.getSource(), context.getLookup(), 0)) {return Result.ofPlanNode(new ValuesNode(node.getId(), node.getOutputSymbols(), ImmutableList.of()));}// 如果只有一条结果的话,直接裁掉Sort算子if (isScalar(node.getSource(), context.getLookup())) {return Result.ofPlanNode(node.getSource());}return Result.empty();
}
五. PruneOrderByInAggregation规则
PruneOrderByInAggregation 主要作用是裁剪掉聚合函数内部的sort算子。如下执行计划所示,sum(id order by id)中的order by无意义,因此可以裁剪掉。
其代码实现的过程如下所示:
public Result apply(AggregationNode node, Captures captures, Context context)
{......for (Map.Entry<Symbol, Aggregation> entry : node.getAggregations().entrySet()) {Aggregation aggregation = entry.getValue();// 聚合操作中无sort操作,不做处理if (!aggregation.getOrderingScheme().isPresent()) {aggregations.put(entry);}// getAggregateFunctionImplementation can be expensive, so check it last.else if (metadata.getFunctionAndTypeManager().getAggregateFunctionImplementation(aggregation.getFunctionHandle()).isOrderSensitive()) {aggregations.put(entry);}// 聚合操作中无sort操作,裁剪掉sort算子else {anyRewritten = true;aggregations.put(entry.getKey(), new Aggregation(aggregation.getFunctionCall(),aggregation.getArguments(),aggregation.isDistinct(),aggregation.getFilter(),Optional.empty(), // 裁剪sort算子的地方aggregation.getMask()));}}......
}
Presto RBO之 Sort算子优化相关推荐
- Presto RBO 之Limit 下推优化
一. 引言 理论上讲,limit下推到越底层,上游吐出的数据就越少,计算效率就越高.因为,带有limit的计划执行树,在Presto中的RBO优化中,都尽可能将其推到底下执行.本文主要讲几个Prest ...
- Presto RBO之broadcast join与partitioned join类型的选择优化
一. broadcast join和partitioned join的区别 broadcast与partitioned join的主要区别见: 优点 缺点 适用场景 broadcast join 内存 ...
- TVM darknet yolov3算子优化与量化代码的配置方法
TVM darknet yolov3算子优化与量化代码的配置方法 使用以下接口函数 tvm.relay.optimize quantize.quantize 实际代码: convert nnv ...
- GEMM与AutoKernel算子优化
GEMM与AutoKernel算子优化 随着AI技术的快速发展,深度学习在各个领域得到了广泛应用.深度学习模型能否成功在终端落地应用,满足产品需求,一个关键的指标就是神经网络模型的推理性能.一大波算法 ...
- GEMM性能提升200倍,AutoKernel算子优化工具正式开源
作者 | OPEN AI LAB 研究员 吕春莹 出品 | AI科技大本营 头图 | CSDN下载自视觉中国 随着AI技术的快速发展,深度学习在各个领域得到了广泛应用.深度学习模型能否成功在终端落地应 ...
- PostgreSQL 到底是基于规则优化(RBO)还是基于代价优化(CBO)的
物理优化和逻辑优化是数据库查询优化的两个方面. 物理优化: 物理优化是指优化查询的物理执行计划,即如何访问磁盘.缓存以及如何进行排序等操作,以便最大化查询性能.物理优化涉及到磁盘 I/O.内存使用.排 ...
- Presto RBO 之 算子列裁剪
一. 引言 RBO是SQL引擎中基于规则对用户输出的sql进行等价优化,是所有SQL引擎中性能优化中最为重要的一环.本文将浅述Presto的RBO优化代码中作者对算子输出进行列裁剪部分的理解. 二. ...
- Presto RBO 之LimitPushDown 代码走读
一. 前言 presto中,RBO的规则有两种写法,一种是implements Rule(比如PushLimitThroughUnion等),一种是implements PlanOptimizer(比 ...
- AICompiler编译器介绍及访存密集算子优化
简介:欢迎走进阿里云机器学习PAI AICompiler编译器系列.随着AI模型结构的快速演化,底层计算硬件的层出不穷,用户使用习惯的推陈出新,单纯基于手工优化来解决AI模型的性能和效率问题越来越容易 ...
最新文章
- 2022年全球及中国光纤馈通件行业发展建议与十四五规划动向展望报告
- java swt 菜鸟教程_编程基础学习JS的入门教程
- 用户、角色和权限,多表查询
- weblogic获取文件的路径问题
- 读人是基础,看人是关键,做人最重要
- MySQL 面试,必须掌握的 8 个知识点
- hudi的安装和使用
- 申万一级行业日指数_2017年申万一级行业分类表
- java实现Tomasulo算法_并行计算机组成与设计pdf
- find7刷Android,OPPO Find 7刷Color OS 2.0教程
- Linux(七)DNS域名解析服务器学习
- 【ONNX】使用 C++ 调用 ONNX 格式的 PyTorch 深度学习模型进行预测(Windows, C++, PyTorch, ONNX, Visual Studio, OpenCV)
- Windows下LATEX排版论文攻略—CTeX、JabRef使用心得, 包括 IEEEtran.bst
- 关闭Chrome浏览器的自动更新和升级提示
- 让你的 wowza 服务器提供 RESTful web 服务
- fm算法 c语言,推荐算法之—FM
- 一周快讯:乐视网市值蒸发349亿,钱宝网张小雷被逮
- 运维实战:DNS服务篇
- 罗密哦与朱丽叶----this指针、函数封装
- 国瀚实业|常见的家庭理财资产配置误区你知道吗
热门文章
- 昨晚涛哥直播秀了一把代码。。。
- 黑龙江省新一轮“双一流”建设名单公布,哈工大、哈工程、哈理工计算机科学与技术在列...
- 一款好用的服务器——优豆云
- vim/Linux常用命令
- 一位华为码农的讲述:我来自农村,我看到的真实现状(虐心)
- 银行借道发力聚合支付
- (转)英文学习资源站点
- python docx tables_pythondocx保留格式替换表格内容
- 大学c语言程序上机考试试题,C语言上机考试试题练习(2)
- 浅谈​一个与彼得原理和责任管理有关的小故事