gp如何处理查询请求

【查询计划和调度】

查询处理顺序:
1. 用户查询请求
2. Master(解析sql、优化sql)
3. Master把任务分配到各个Segment执行
4. 每个segment负责查询自己本节点数据(执行的操作包括:table scan、join、aggregations、sort)
这些都是同时并行执行的、而且都是独立的。
如果某个查询只涉及到单个segment的数据的话,master是不会分配到所有的segment,仅仅是分配至该segment。例如: 单行的增删改查、通过表的分布键过滤后的少量结果集...等等
5. 查询的结果返回给master
6. master再发送给用户
undefined
(图: 执行计划-多个segment)

undefined

(图: 执行计划-单个segment)

【查询计划】
查看Query Plan的时是从底至上的。
Motion -- 主要是涉及到多个节点之间完成任务的话,节点之间会发生数据移动。

Slice -- GP在执行查询时为了获得最优性能,把任务进行了切片。一个查询计划是根据motion来进行切分的,每个slice以motion作为边界。

Redistribute Motion -- Segment之间移动数据。 这个是非常之消耗性能的 。在前期表设计的时候就要避免这样的操作。
Gather Motion -- Segment将数据传给Master。不是所有的查询计划都调用gather motion。例如:CREATE TABLE AS SELECT ...这个就没有gather motion,结果被存储到新表里面是不需要经过master的。
eg:SELECT customer,amount
FROM sales JOIN customer USING (cust_id)
WHERE dateCol = '03-06-2012';
查询计划如下图:
undefined
(图: 查询计划切片)
【并行查询】
Query Dispather(QD) -- Master节点查询任务处理,负责创建和分配查询计划、收集传送最终结果
Query Executor(QE) -- Segment节点查询处理,负责完成数据的计算、多个QE之间的中间结果通讯。为查询计划的每个slice会被分配到至少一个worker process
Gangs -- 工作于相同slice的查询计划的相关process。当一个slice任务完成后,这个gang会把数据向上级gang传递。内部通信是通过内部进程来控制的。


你可能感兴趣的:(GP,如何处理查询请求)