Greenplum 分布式数据库内核揭秘(下篇)

了解更多Greenplum技术干货,欢迎访问Greenplum中文社区网站

​点击查看Greenplum 分布式数据库内核揭秘(上篇)

1. 分布式执行器

现在有了分布式数据存储机制,也生成了分布式查询计划,下一步是如何在集群里执行分布式计划,最终返回结果给用户。

Greenplum 执行器相关概念

先看一个 SQL 例子及其计划:

test=# CREATE TABLE students (id int, name text) DISTRIBUTED BY (id);  
test=# CREATE TABLE classes(id int, classname text, student_id int) DISTRIBUTED BY (id);  
test=# INSERT INTO students VALUES (1, 'steven'), (2, 'changchang'), (3, 'guoguo');  
test=# INSERT INTO classes VALUES (1, 'math', 1), (2, 'math', 2), (3, 'physics', 3);  
  
test=# explain SELECT s.name student_name, c.classname  
test-# FROM students s, classes c  
test-# WHERE s.id=c.student_id;  
QUERY PLAN  
----------------------------------------------------------  
Gather Motion 2:1  (slice2; segments: 2)  (cost=2.07..4.21 rows=4 width=14)  
  ->  Hash Join  (cost=2.07..4.21 rows=2 width=14)  
        Hash Cond: c.student_id = s.id  
        ->  Redistribute Motion 2:2  (slice1; segments: 2)  (cost=0.00..2.09 rows=2 width=10)  
              Hash Key: c.student_id  
              ->  Seq Scan on classes c  (cost=0.00..2.03 rows=2 width=10)  
        ->  Hash  (cost=2.03..2.03 rows=2 width=12)  
              ->  Seq Scan on students s  (cost=0.00..2.03 rows=2 width=12)  
Optimizer status: legacy query optimizer  

这个图展示了上面例子中的 SQL 在2个segment的Greenplum集群中执行时的示意图。

QD(Query Dispatcher、查询调度器):Master 节点上负责处理用户查询请求的进程称为 QD(PostgreSQL 中称之为 Backend 进程)。 QD 收到用户发来的 SQL 请求后,进行解析、重写和优化,将优化后的并行计划分发给每个 segment 上执行,并将最终结果返回给用户。此外还负责整个 SQL 语句涉及到的所有的QE进程间的通讯控制和协调,譬如某个 QE 执行时出现错误时,QD 负责收集错误详细信息,并取消所有其他 QEs;如果 LIMIT n 语句已经满足,则中止所有 QE 的执行等。QD 的入口是 exec_simple_query()。

QE(Query Executor、查询执行器):Segment 上负责执行 QD 分发来的查询任务的进程称为 QE。Segment 实例运行的也是一个 PostgreSQL,所以对于 QE 而言,QD 是一个 PostgreSQL 的客户端,它们之间通过 PostgreSQL 标准的libpq 协议进行通讯。对于 QD 而言,QE 是负责执行其查询请求的PostgreSQL Backend进程。通常 QE 执行整个查询的一部分(称为 Slice)。QE 的入口是 exec_mpp_query()。

Slice:为了提高查询执行并行度和效率,Greenplum 把一个完整的分布式查询计划从下到上分成多个 Slice,每个 Slice 负责计划的一部分。划分slice的边界为 Motion,每遇到 Motion 则一刀将 Motion切成发送方和接收方,得到两颗子树。每个 slice 由一个QE进程处理。上面例子中一共有三个 slice。

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值