orca 简记
框架
与外部交互使用的是 dxl * 内部预置大量的序列化的文件,包含元数据信息,测试文件等 * 集成到 gp 的时候,Query 结构体使用 CTranslatorQueryToDXL 转换
后续由 CTranslatorDXLToExpr 转换为 CExpression * 优化核心就是 处理 CExpression * CExpression 当前不仅仅只是 logicalNode 和 physicalNode,普通得表达式也是 CExpression ,都会使用一个 Group 保存, 这会导致 Group 暴增, 普通表达式在后续优化得时候是不怎么需要处理得
状态机
说是可以job并行,但是并没有看见具体得实现逻辑,就连 threads.h 都没有
最之前有实现并行,但是 61c7405ac737ce74804d57d8cd6c930219e8b124 移除了并行机制,可是积重难返,部分框架是为了并行而实现的,所以在非并行的情况下,看起来不是那么正常
常规 cascades 框架也可以看成是先 expolation 再 implemention * expolation 没有看见太大得差别,后面再看 * implemention 会进行剪纸,不会全部生成
核心结构
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,