关联数据在不同节点上,对于普通关系型数据库来说,是无法进行连接的。关联的数据需要通过网络流入到一个节点中进行计算,这样就需要发生数据迁移。数据迁移有广播和重分布两种。在GP中,每一个广播或重分布会产生一个切片,每一个切片在每个数据节点上都会对应发起一个进程来处理该slice负责的数据,上一层负责该slice的进程会读取下级slice广播或重分布的数据,然后进行相应的计算。

当两张表关联的时候,如果有一张表的关联键不是分布键,那么就会发生表的广播或者重分布,将数据移动到一个节点上进行关联,从而获得数据。
分布式的关联有两种:
单库关联:关联键与分布键一致,只需要但单个库关联后得到结果即可。
跨库关联:关联键与分布键不一致,数据需要重新分布。转换成单库关联,从而实现表的关联。

表关系如下:

表A
字段:id,id2
分布键:id
数据量:M

表B
字段:id,id2
分布键:id
数据量:N

内连接

情况1:

select * from A,B where A.id=B.id;
分布键与关联键相同,属于单库关联,不会造成广播或者重分布。

情况2:

select * from A,B where A.id=B.id2;
表A的关联键是分布键,表B的关联键不是分布键,那么可以通过两种凡是来实现关联。
1. 将表B按照id2字段将数据重分布到一个节点上,然后再与表A进行关联。重分布的数据量是N。
2. 将表A广播,每一个节点都放一份全量数据,然后再与表B关联得到结果。广播的数据量是M*节点数。
所以,当N>M*节点数的时候,选择表A广播,否则选择B重分布。

情况3:

select * from A,B where A.id2=B.id2;
两个表的关联键与分布键都不一样,那么还有两种做法:
1. 将表A与表B按照id2字段,将数据重分布到每个节点,重分布的代价是M+N。
2. 将其中一张表广播后再关联,当然选取小表广播,代价小。广播的代价是min(M,N)*节点数。
所以当M+N>min(M,N)*节点数的时候,选择小表广播,否则选择两个表都重分布。

左连接

情况1:

select * from A left join B on A.id=B.id;
单库关联,不涉及数据库跨库关联。

情况2:

select * from A left join B on A.id=B.id2;
由于左表的分布键是关联键,鉴于左连接的性质,无论表B数据量多大,都必须将表B按照字段id2重分布数据。

情况3:

select * from A left join B on A.id2=B.id;
左表的关联键不是分布键,由于左连接A表肯定不是被广播的,所以有两种方式。
1. 将表A按照id2重分布数据,转换成情况A,代价为M。
2. 将表B广播,代价为N*节点数。

情况4:

select * from A left join B on A.id2=B.id2;
有两种处理方式。
1. 将表A与表B都按照id2字段将数据重分布一遍以,转换成情况1,代价是M+N。
2. 表A不能被广播,只能将表B广播,代价是N*节点数。

全连接

情况1:

select * from A full outer join B on A.id=B.id;

关联键是分布键,在GP中全连接只能采用Merge Join来实现。

情况2:

select * from A full outer join B on A.id=B.id2;
将不是关联键不是分布键的表重分布数据,转换成情况1解决。无论A、B大小分别为多少,为了实现全连接,不能讲表广播,只能是重分布。

情况3:

select * from A full outer join B on A.id2=B.id2;
将两张表都重分布,转换成情况1进行处理。

《Greenplum企业应用实战》

Greenplum 执行计划之广播与重分布的更多相关文章

  1. [转]Greenplum 执行计划之广播与重分布

    关联数据在不同节点上,对于普通关系型数据库来说,是无法进行连接的.关联的数据需要通过网络流入到一个节点中进行计算,这样就需要发生数据迁移.数据迁移有广播和重分布两种.在GP中,每一个广播或重分布会产生 ...

  2. Greenplum查询计划分析

    这里对查询计划的学习主要是对TPC-H中Query2的分析. 1.Query的查询语句 select s_acctbal, s_name, n_name, p_partkey, p_mfgr, s_a ...

  3. SQL Server中参数化SQL写法遇到parameter sniff ,导致不合理执行计划重用的一种解决方案

    parameter sniff问题是重用其他参数生成的执行计划,导致当前参数采用该执行计划非最优化的现象.想必熟悉数据的同学都应该知道,产生parameter sniff最典型的问题就是使用了参数化的 ...

  4. 关于T-SQL重编译那点事,内联函数和表值函数在编译生成执行计划的区别

    本文出处:http://www.cnblogs.com/wy123/p/6266724.html 最近在学习 WITH RECOMPILE和OPTION(RECOMPILE)在重编译上的区别的时候,无 ...

  5. SQL Server 利用Profiler观察执行计划是否重用时SP:Cachemiss,SP:CacheInsert以及SP:CacheHit的含义

    本文出处:http://www.cnblogs.com/wy123/p/6913055.html 执行计划的缓存与重用 在通过SQL Profile观察一个SQL语句或者存储过程是否有可用的缓存执行计 ...

  6. MySQL-4- 索引及执行计划

    1. 索引作用 提供了类似于书中目录的作用,目的是为了优化查询 2. 索引的种类(算法) B树索引 Hash索引 R树 Full text GIS 3. B树 基于不同的查找算法分类介绍   B-tr ...

  7. MSSQLSERVER执行计划详解

    序言 本篇主要目的有二: 1.看懂t-sql的执行计划,明白执行计划中的一些常识. 2.能够分析执行计划,找到优化sql性能的思路或方案. 如果你对sql查询优化的理解或常识不是很深入,那么推荐几骗博 ...

  8. SELECT TOP 1 比不加TOP 1 慢的原因分析以及SELECT TOP 1语句执行计划预估原理

    本文出处:http://www.cnblogs.com/wy123/p/6082338.html 现实中遇到过到这么一种情况: 在某些特殊场景下:进行查询的时候,加了TOP 1比不加TOP 1要慢(而 ...

  9. SQL Server 执行计划缓存

    标签:SQL SERVER/MSSQL SERVER/数据库/DBA/内存池/缓冲区 概述 了解执行计划对数据库性能分析很重要,其中涉及到了语句性能分析与存储,这也是写这篇文章的目的,在了解执行计划之 ...

随机推荐

  1. Python-20-异常处理

    一.什么是异常 异常就是程序运行时发生错误的信号(在程序出现错误时,则会产生一个异常,若程序没有处理它,则会抛出该异常,程序的运行也随之终止) 常用异常: AttributeError 试图访问一个对 ...

  2. 从零开始学Flask框架-007

    Flash消息 from flask import flash 渲染Flash消息,在基模板base.html中引入get_flashed_messages() {% extends "bo ...

  3. 【HC89S003F4开发板】 4端口消抖

    HC89S003F4开发板端口消抖 一.前言 看到资料里有中断消抖的例子,因为以前项目里有遇到高频干扰频繁退出休眠的情况,所以好奇用这个配置能不能解决. 二.对demo进行修改 @实现效果 P01设置 ...

  4. Java LowerBound

    Java LowerBound /** * <html> * <body> * <P> Copyright 1994-2018 JasonInternational ...

  5. Flask无法访问(127.0.0.1:5000)的问题解决方法

    Flask默认开启的ip地址是:http://127.0.0.1:5000/ 但在运行时可能存在无法访问的问题,特别是当我们在linux服务器上搭建flask时,此时需要将代码修改如下: app.ru ...

  6. ReLU函数的缺陷

    ReLU激活功能并不完美. 它有一个被称为 “ReLU 死区” 的问题:在训练过程中,一些神经元会“死亡”,即它们停止输出 0 以外的任何东西.在某些情况下,你可能会发现你网络的一半神经元已经死亡,特 ...

  7. MySQL性能测试调优

    MySQL性能测试调优 操作系统 基本操作 查看磁盘分区mount选项 $ mount 永久修改分区mount选项(系统重启后生效) 修改文件 /etc/fstab 中对应分区的mount optio ...

  8. js 单引号和双引号相互替换的实现方法

    1.双引号替换成单引号 var domo = JSON.stringify(address).replace(/\"/g,"'"); var a = {a:1,b:2}; ...

  9. Java 之 Junit 单元测试

    Junit 单元测试 测试分类: 1.黑盒测试:不需要写代码,给输入值,看程序是否能够输出期望的值. 2.白盒测试:需要写代码.关注程序具体的执行流程. Junit 测试:(属于白盒测试) 步骤: 1 ...

  10. stm32 FSMC-TFTLCD显示

    TFTLCD TFT液晶屏常用的通信模式主要有6800模式和8080模式,对于TFT彩屏通常都使用8080并口(简称80并口)模式 8080模式的读写时序其实跟LCD1602或者LCD12864的读写 ...