一. 前言

在presto中,partition join和broadcast join的差异主要在执行计划的方式上。如果join的一侧直接以REPLICATE exchange的方式将数据传送到另外一侧,则为broadcast join,如下图1的执行计划所示。 如果join 两侧的数据经过REPARTITION后再进行exchange到下游执行join操作,则为partition join,如下图2。

图1: broadcast join执行计划样例

图2: partition join执行计划样例

在presto中,可以通过设置join_distribution_type参数强制使用任意一种join方式。

在presto中,生成partition join和broadcast join的执行计划在AddExchanges::visitJoin中实现的。

public PlanWithProperties visitJoin(JoinNode node, PreferredProperties preferredProperties)
{....if (distributionType == JoinNode.DistributionType.REPLICATED) {// 生成broadcast  join执行计划planReplicatedJoin(node, left);}else {// 生成partition join执行计划return planPartitionedJoin(node, leftSymbols, rightSymbols);}
}

二. broadcast join

private PlanWithProperties planReplicatedJoin(JoinNode node, PlanWithProperties left)
{PlanWithProperties right = node.getRight().accept(this, PreferredProperties.any());// 如果左表已经是单节点运行的任务了(比如coordaintor的aggregate), 则右表添加ExchangeNode.Type.GATHER的exchange 汇聚到左表执行join操作if (left.getProperties().isSingleNode()) {if (!right.getProperties().isSingleNode() ||(!isColocatedJoinEnabled(session) && hasMultipleSources(left.getNode(), right.getNode()))) {right = withDerivedProperties(gatheringExchange(idAllocator.getNextId(), REMOTE, right.getNode()),right.getProperties());}}else {// 右表直接以ExchangeNode.Type.REPLICATE的形式复制到左表,实现数据广播right = withDerivedProperties(replicatedExchange(idAllocator.getNextId(), REMOTE, right.getNode()),right.getProperties());}return buildJoin(node, left, right, JoinNode.DistributionType.REPLICATED);
}

三. partition join

partition join的实现比broadcast join复杂一些,因为涉及到以哪一列进行hash的问题。其实现的过程如以下代码所示:

private PlanWithProperties planPartitionedJoin(JoinNode node, List<Symbol> leftSymbols, List<Symbol> rightSymbols, PlanWithProperties left)
{SetMultimap<Symbol, Symbol> rightToLeft = createMapping(rightSymbols, leftSymbols);SetMultimap<Symbol, Symbol> leftToRight = createMapping(leftSymbols, rightSymbols);PlanWithProperties right;// 左表的join列且是分区列if (left.getProperties().isNodePartitionedOn(leftSymbols) && !left.getProperties().isSingleNode()) {// 找到左表join列对应的右表列,对该列进行hash PartitioningPartitioning rightPartitioning = left.getProperties().translate(createTranslator(leftToRight)).getNodePartitioning().get();right = node.getRight().accept(this, PreferredProperties.partitioned(rightPartitioning));if (!right.getProperties().isCompatibleTablePartitioningWith(left.getProperties(), rightToLeft::get, metadata, session)) {// 如下一行代码会添加一个ExchangeNode.Type.REPARTITION的exchage,hash的列为右表的join列,从而实现对右表进行REPARTITION到下游进行join操作 right = withDerivedProperties(partitionedExchange(idAllocator.getNextId(), REMOTE, right.getNode(), new PartitioningScheme(rightPartitioning, right.getNode().getOutputSymbols())),right.getProperties());}}else {right = node.getRight().accept(this, PreferredProperties.partitioned(ImmutableSet.copyOf(rightSymbols)));// 如下的代码用意和上边相同,只是操作的左表,尝试将左表进行REPARTITION到下游进行join操作 if (right.getProperties().isNodePartitionedOn(rightSymbols) && !right.getProperties().isSingleNode()) {Partitioning leftPartitioning = right.getProperties().translate(createTranslator(rightToLeft)).getNodePartitioning().get();left = withDerivedProperties(partitionedExchange(idAllocator.getNextId(), REMOTE, left.getNode(), new PartitioningScheme(leftPartitioning, left.getNode().getOutputSymbols())),left.getProperties());}else {// 如下是处理无分区列的情况,左右表都按照自己Join列进行Hash partition,然后exchange到下游执行join 操作left = withDerivedProperties(partitionedExchange(idAllocator.getNextId(), REMOTE, left.getNode(), leftSymbols, Optional.empty()),left.getProperties());right = withDerivedProperties(partitionedExchange(idAllocator.getNextId(), REMOTE, right.getNode(), rightSymbols, Optional.empty()),right.getProperties());}}....return buildJoin(node, left, right, JoinNode.DistributionType.PARTITIONED);
}

Presto中broadcast join和partition join执行计划的处理过程相关推荐

  1. 在Oracle中,如何得到真实的执行计划?

    在Oracle中,如何得到真实的执行计划? Oracle查看执行计划的几种方法:http://blog.itpub.net/26736162/viewspace-2136865/ 一.  如何得到真实 ...

  2. 【DB笔试面试600】在Oracle中,如何获取SQL历史执行计划?

    ♣题目 部分 在Oracle中,如何获取SQL历史执行计划? ♣答案部分 历史执行计划只能从AWR中获取,如果AWR没有记录的话,那么就无法获取历史执行计划了,获取历史执行计划的命令如下所示: 1SE ...

  3. MR实现reduce join和map join及hive的执行计划

    一.涵盖 MapReduce InputFormat RecordReader 切片:block=input split 1.1 File- Text- NLine- DB- Mapper setup ...

  4. mysql执行计划中性能最差的是_面试中:mysql性能调优-执行计划explain

    mysql的sql调优大家都不陌生,可是调优前都会先看下执行计划,这个是必须的. 插播图片: explain 这个是关键字执行如下: explain select * from user 结果如下: ...

  5. 在 MySQL 中使用 explain 查询 SQL 的执行计划(转自: 数据分析与开发)

    **来源:Oo若离oO my.oschina.net/ruoli/blog/1807394** 1.什么是MySQL执行计划 要对执行计划有个比较好的理解,需要先对MySQL的基础结构及查询基本原理有 ...

  6. 在MySQL中使用explain查询SQL的执行计划

    1.什么是MySQL执行计划 要对执行计划有个比较好的理解,需要先对MySQL的基础结构及查询基本原理有简单的了解. MySQL本身的功能架构分为三个部分,分别是 应用层.逻辑层.物理层,不只是MyS ...

  7. mysql 执行计划 order_MySQL · 捉虫动态 · 5.6中ORDER BY + LIMIT 错选执行计划

    问题描述 create table t1(id int auto_increment primary key, a int, b int, c int, v varchar(1000), key ia ...

  8. <POSTGRESQL修炼之道:从小工到专家>之PostgreSQL中执行计划(1-3结)

    文章目录 一.执行计划的解释 1.EXPLAIN命令 2.EXPLAIN输出结果解释 3.EXPLAIN使用示例 4.全表扫描 5.索引扫描 6.位图扫描 7.条件过滤 8.Nestloop Join ...

  9. mysql 执行计划extra_MySQL执行计划extra中的using index 和 using where using index 的区别...

    www.linuxidc.com/Linux/2017-- mysql执行计划中的extra列中表明了执行计划的每一步中的实现细节,其中包含了与索引相关的一些细节信息 其中跟索引有关的using in ...

最新文章

  1. 银行家算法回顾[JAVA实现]
  2. 功能性农业投融资-农业大健康·周荣江:国情讲坛体制创新
  3. centos安装zendopcache
  4. 手游频繁崩溃”闪退”? 从程序上找原因
  5. curl在android服务器上编译,Android curl的上载编译和使用
  6. 晶圆产能紧缺,成就华为的“无厂模式”反成败笔
  7. Maven学习总结(52)——Maven 配置文件密码加密机制使用说明
  8. 项目演化系列--分布式锁
  9. oracle 地市 区县分组,oracle分组写法 - 挣扎在陌生城市ITMAN的个人空间 - OSCHINA - 中文开源技术交流社区...
  10. (转)UIWebView的基本用法,适合新手
  11. Fedora 24 x86 安装VirtualBox
  12. 【机器学习算法】线性回归算法
  13. opencv 绿色通道提取
  14. spark another attempt succeeded
  15. 零基础入门运维必备 | 一文总结学习 Python 的 14 张思维导图
  16. echart 实现地图坐标轴带图标
  17. 訾博 2021年1月29日 周五 晴 致敬“最可爱的人”
  18. 对客户信息收集,收集用户行为的方法总结
  19. philink显示无法连接服务器,NV Link—连接新时代的最强Link_NVIDIA显示芯片_显卡技术应用-中关村在线...
  20. cartographer 源码解析 (五)

热门文章

  1. ip (internet protocol)
  2. 开发STM32相关资料下载
  3. 控制系统稳态误差(静态误差)分析
  4. img服务器上的图片不显示不出来,img标签使用绝对路径无法显示图片
  5. 消息称勒索软件可逃避PC防御、Office漏洞补丁能被攻击者绕过|12月24日全球网络安全热点
  6. 【IT】计算机体系结构
  7. 如何用matlab演奏《偏爱》
  8. 最新|神秘的互联网大厂薪资和职级!
  9. centos6.5卸载图形界面
  10. Spring 的 init-method 和 destory-method