1. 框架

  2. 与外部交互使用的是 dxl * 内部预置大量的序列化的文件,包含元数据信息,测试文件等 * 集成到 gp 的时候,Query 结构体使用 CTranslatorQueryToDXL 转换

  3. 后续由 CTranslatorDXLToExpr 转换为 CExpression * 优化核心就是 处理 CExpression * CExpression 当前不仅仅只是 logicalNode 和 physicalNode,普通得表达式也是 CExpression ,都会使用一个 Group 保存, 这会导致 Group 暴增, 普通表达式在后续优化得时候是不怎么需要处理得

  4. 状态机

  5. 说是可以job并行,但是并没有看见具体得实现逻辑,就连 threads.h 都没有

  6. 最之前有实现并行,但是 61c7405ac737ce74804d57d8cd6c930219e8b124 移除了并行机制,可是积重难返,部分框架是为了并行而实现的,所以在非并行的情况下,看起来不是那么正常

  7. 常规 cascades 框架也可以看成是先 expolation 再 implemention * expolation 没有看见太大得差别,后面再看 * implemention 会进行剪纸,不会全部生成

  8. 核心结构

  9. Optimizer

  • enforcer: *

  • CRewindabilitySpec 有必要吗,会怎么影响执行计划,pg 中path得选择实际没有考虑到 rewindability,所以可能是多余的

    • 单机应该没用,但是分布式下由于无法保证节点数据得顺序,所以可能需要使用此标记判断是否需要物化
  • CDistributionSpec gp 分布式下必要组件,用于生成分布式执行计划,单机无比要,是必须去掉的

    • 绝大多数代码都和这个结构体有联系, 且所有测试都是基于分布式进行测试得,单纯的关闭 motion 测试是无法正常通过的
    • 简单的改写代码,让 reqpro 的 dit 为 any ,某些测试是可以通过的
  • 某些执行计划中的 node pg 不存在, 是否需要添加 exec 的 hook

  • 简单支持 单表查询,indexscan,join 查询,以及聚合操作和子查询


postgres=# explain (verbose, analyze) select o_totalprice + 1 from orders where o_orderkey = 1000 and o_shippriority + 1 < 10;
                                                   QUERY PLAN
-----------------------------------------------------------------------------------------------------------------
 Result  (cost=0.00..431.00 rows=1 width=8) (actual time=24.653..24.654 rows=0 loops=1)
   Output: (o_totalprice + "numeric"(1))
   ->  Seq Scan on public.orders  (cost=0.00..431.00 rows=1 width=8) (actual time=24.653..24.653 rows=0 loops=1)
         Output: o_totalprice
         Filter: ((orders.o_orderkey = 1000) AND ((orders.o_shippriority + 1) < 10))
         Rows Removed by Filter: 225385
 Planning Time: 40.907 ms
 Execution Time: 24.676 ms
(8 rows)
  • 保证简单查询语句可以执行, 移除 motion

  • 简化代码

  • gp 和 orca 中的 node 的分布的生成过程是相反的

    • orca 中 node 的分布是由 上到下驱动的,例如最顶层要求 CDistributionSpecSingleton(CDistributionSpecSingleton::EstCoordinator), 然后使用此属性 enforce 下层
  • PdsDerive

    • drive node 的 distrbution , 类似 path 中的 locus
    • 大部分 node CDistributionSpec 直接从 child 直接 drive 即可,少部分需要特殊处理,例如 join,