查询处理概述

要进行有效的 SQL 调优,就必须要理解什么是查询计划;而对查询计划的理解又建立在了解数据库管理系统中一次完整的查询操作流程基础之上。YMatrix 作为经典数据库 PostgreSQL 系的发展与优化产品,其查询处理机制也继承了 PostgreSQL 系(主要是 Greenplum 数据库)的经典机制。

Greenplum 数据库将节点分为 Master 节点与 Segment 节点,在 PostgreSQL 数据库的基础上发展出更适合分布式数据库系统的查询处理机制:

  • Master 接收查询语句并生成查询计划。
  • Master 把查询计划分发到 Segments。
  • Segments 并发在各自本地的数据集上执行计划。
  • Master 收集结果并返回给客户端。

其中查询计划的分发有两种方式:

  • 分发并行查询计划
  • 分发定向查询计划

分发并行查询计划意味着大部分的数据库操作(例如表扫描、连接、聚集和排序)都会以并行的方式在所有 Segment 节点实例上执行。在一个 Segment 实例的数据库上执行的每个操作都独立于存储在其他 Segment 实例数据库中的数据。

分发定向查询计划则表示某些查询可能只访问单个 Segment 上的数据,例如单行的 INSERTUPDATEDELETE 或者 SELECT 操作或者以表分布键列过滤的查询。在这些查询中,查询计划不会发送给所有 Segment 实例,而是定向给到包含受影响或者相关行的 Segment 实例。

需要注意的是,分布式数据库中的定向查询计划与单机查询计划是不同的。因为通常分布式数据库的每一台服务器上都会有多个 Segment 节点实例,而不像单机数据库总共只有一个 Segment,因此即使在创建表的时候没有设置分布键,数据也可能被存储在同一服务器的多个 Segment 上,而非一个 Segment。 这种情况下,即使定向查询计划仅指向一台服务器,它也有可能会调用 Motion 算子来汇总多个 Segment 的数据。