Query Processing
Query Planning and Dispatch
大多数数据库操作如表扫描、连接、聚合和排序在所有segments上并行执行。每个操作都是在一个segments数据库上执行的,独立于存储在其他segments数据库中的数据。

某些查询可能只访问单个segment上的数据,例如单行插入、更新、删除、选择操作或过滤表分布键列的查询。在这样的查询中,查询计划不是分派到所有segments,而是针对包含受影响的行或相关行的segment。

2. Greenplum Query Plans
Query Plans是Greenplum Database为生成查询答案而执行的一组操作。计划中的每个节点或步骤表示一个数据库操作,如表扫描、连接、聚合或排序。从下到上读取和执行计划。
除了常见的数据库操作(如表扫描、连接等)之外,Greenplum数据库还有一种称为motion的额外操作类型。移动操作包括在查询处理过程中在segments之间移动元组。注意,并不是每个查询都需要一个动议。例如,目标查询计划不需要数据在互连网络上移动。
为了在查询执行过程中获得最大的并行度,Greenplum将查询计划的工作划分为多个片。切片是计划的一部分,各部分可以独立工作。在计划中发生移动操作的地方,查询计划就会被切片,每一边都有一个切片。
我们看下面这个例子:
SELECT customer, amount
FROM sales JOIN customer USING (cust_id)
WHERE dateCol = '04-30-2016';

看上面的查询计划,每个segment接收一个执行计划的副本,并并行执行它。本例的查询计划有一个redistribute motion,它在segments之间移动元组以完成连接。redistribute motion是必要的,因为customer表是通过cust_id在各个segments中分布的,而sales表是通过sale_id在各个分段中分布的。要执行联接,销售元组必须通过cust_id重新分配。计划在redistribute motion的任意一边进行切片,创建切片1和切片2。
该查询计划具有另一种类型的操作,称为gather motion。gather motion是指segments将结果发送回主程序,并呈现给客户端。因为查询计划总是在任何移动发生的地方进行切片,所以该计划在计划的最顶部还有一个隐式切片(切片3)。例如,一个CREATE TABLE x AS SELECT…语句不会有一个收集动作,因为元组被发送到新创建的表,而不是主表。
3.Parallel Query Execution
Greenplum创建了许多数据库进程来处理查询工作。在Master上,查询工作进程称为query dispatcher(QD)。QD负责创建和调度查询计划。它也会累积并呈现最终结果。在segments,查询工作进程称为query executor(QE)。QE负责完成其部分的工作,并将其中间结果传达给其他工作流程。
至少有一个工作进程分配给查询计划的每个切片。工作进程独立地处理其分配的查询计划部分。在查询执行期间,每个段将有多个进程并行处理该查询。
Related processes that are working on the same slice of the query plan but on different segments are called gangs。As a portion of work is completed, tuples flow up the query plan from one gang of processes to the next. This inter-process communication between the segments is referred to as the interconnect component of Greenplum Database.





