问题描述
Greenplum 中有一张 400 GB 的表。以下查询在服务器上拥有所有可用资源(4 个数据段)时花费了大量时间
select max(date_key) from tablex; 表结构如下:
- 没有PK
- 无压缩
- 以唯一密钥分发(已确认
- 按月分区 (date_key)
- date_key 上的索引
解决方法
master 接收、解析和优化查询。生成的查询计划要么是并行的,要么是有针对性的。 Master 将并行查询计划调度到所有段,如图 1 所示。Master 将目标查询计划调度到单个 Segment,如图 2 所示。每个 Segment 负责对自己的数据集执行本地数据库操作。 大多数数据库操作(例如表扫描、连接、聚合和排序)在所有段中并行执行。每个操作都在一个段数据库上执行,独立于其他段数据库中存储的数据。 某些查询可能仅访问单个段上的数据,例如单行 INSERT、UPDATE、DELETE 或 SELECT 操作或对表分布键列进行过滤的查询。在此类查询中,查询计划不会分派到所有段,而是针对包含受影响或相关行的段。
理解Greenplum查询计划 查询计划是 Greenplum 数据库将执行以生成查询答案的一组操作。计划中的每个节点或步骤代表一个数据库操作,例如表扫描、联接、聚合或排序。从下到上阅读和执行计划。 除了表扫描、连接等常见的数据库操作外,Greenplum数据库还有一个额外的操作类型叫做运动。运动操作涉及在查询处理期间在段之间移动元组。请注意,并非每个查询都需要一个动作。例如,有针对性的查询计划不需要数据跨互连移动。 为了在查询执行期间实现最大并行度,Greenplum 将查询计划的工作划分为多个切片。切片是计划的一部分,各段可以独立工作。查询计划在计划中发生运动操作的任何地方进行切片,运动的每一侧都有一个切片。 例如,考虑以下涉及两个表之间连接的简单查询: 选择客户,金额 FROM sales JOIN customer USING (cust_id) WHERE dateCol = '04-30-2016';
链接:https://docs.greenplum.org/6-9/admin_guide/query/topics/parallel-proc.html