优化器集成设计、探索与反馈)
缓存KV存储消息队列流处理后端【免费下载链接】hazelcastHazelcast is a unified real-time data platform combining stream processing with a fast data store, allowing customers to act instantly on>项目地址https://gitcode.com/gh_mirrors/ha/hazelcast点击查看免费下载导读本文基于 Hazelcast 仓库中 docs/design/sql/16-columbia-optimizer-feedback.md 这一设计文档完整还原 Hazelcast SQL 团队在评估 Apache Calcite Columbia 优化器Top-Down Optimizer时的设计思路、接入要求、集成冲突与最终决策。作为一篇探索反馈型技术实录它同时揭示了 Hazelcast SQL 引擎当前三阶段优化管线无条件重写 → 逻辑优化 → 物理优化的真实结构以及团队为何最终选择搁置优化器升级方向。读完本文你将理解 CASCADES 风格优化器的PhysicalNode接口四个核心方法passThrough/passThroughTraits/derive/deriveTraits的设计意图Hazelcast 物理关系Physical Rel与 Top-Down 优化器物理节点Physical Node概念差异以及规则立即应用于首次 convention 转换这一关键约束如何导致集成方案被否决。文档背景一次被拒绝的优化器迁移该设计文档记录了将 Hazelcast SQL 引擎迁移到 Apache Calcite Columbia 优化器的一次完整技术探索。文档元信息明确标注适用版本5.x文档状态REJECTED方案被否决开发者Sasha Syrotenko技术评审Viliam DurinaREJECTED并非意味着内容无价值恰恰相反它沉淀了团队在迁移过程中发现的关键架构冲突、三种备选方案的失败原因以及一段可以复用的部分实现代码为后续任何优化器升级工作提供了直接的经验输入。这与仓库中另一份外部设计文档 docs/sql/01-query-optimizer.md 相互呼应共同构成理解 Hazelcast SQL 优化器架构的核心材料。Calcite 的 Columbia 优化器与 CASCADES 算法Apache Calcite 自 1.24 版本起引入了 Columbia 优化器实现。它实现了由 Columbia 优化器作者提出的CASCADES 优化算法——一种自上而下top-down搜索最优执行计划的经典数据库查询优化框架其核心思想是父算子按需向子算子请求满足特定物理属性traits的实现从而大幅剪枝搜索空间。在 Calcite 社区中这一实现被命名为Top-Down Rule Driver对应 CALCITE-3916 相关工作项本文与设计文档中均称其为Top-Down Optimizer。要启用该规则驱动器用户需要打开 Calcite 的calcite.planner.topdown.opt选项。从源码结构看Hazelcast 当前并未启用该选项CalciteSqlOptimizerImpl中物理优化仍走基于VolcanoPlanner的规则驱动流程见 CalciteSqlOptimizerImpl.java 的optimizePhysical方法文档结论与此一致。期望收益缩小搜索空间设计文档给出的主要动机非常明确用 Columbia 优化器替换 Volcano 优化器核心收益是减少优化搜索空间。对 Hazelcast SQL 而言收益最直接的算子类型是Index Scan索引扫描需要根据排序collation等物理属性决定是否使用索引路径Merge Join合并连接需要两侧输入满足特定排序属性才能成立搜索空间天然巨大。CASCADES 的 top-down 属性请求机制正是针对这类属性敏感算子设计的——父算子主动提出属性需求子算子只探索满足需求的实现而不是 Volcano 中规则以不可控顺序触发、物理属性难以上行传播的被动模式。这一对比在 CalciteSqlOptimizer.java 的类注释中有深入阐述。Top-Down Optimizer 的接入要求PhysicalNode 接口实现 CASCADES 风格优化的核心前提是优化器可见的每一个物理关系physical rel都必须实现PhysicalNode接口。但设计文档特别强调了一个容易混淆的点!Hazelcast 语境中的物理关系与 Top-Down Optimizer 语境中的物理节点含义不同。Hazelcast 的 Physical Rel 是相对于 Logical Rel 的工程概念对应PHYSICAL约定而 Top-Down Optimizer 的 Physical Node 是 CASCADES 算法中的搜索树节点抽象。PhysicalNode接口包含 4 个需要实现的方法各自职责如下passThrough向下传播属性请求将来自父关系的 trait 请求传播给其子关系。最常见的情况下它返回原关系的一个副本并在副本上满足被传播的 trait。但在某些情况下基于 trait 传播分析原关系可能被替换为另一个关系。典型的例子基于collation排序trait 状态以及被请求排序列上是否存在排序索引强制实现Full Scan - Index Scan的转换。在设计文档的原型实现中大多数关系使用默认实现只有少数关系如FullScanPhysicalRel定义了自定义逻辑。从仓库源码看IndexScanMapPhysicalRel正是 trait/collation 敏感的典型它的getRowType、comparisonFn构建、isIndexScanOrdered判断以及withoutCollation()方法都围绕 trait 集中的RelCollation展开见 IndexScanMapPhysicalRel.java印证了扫描实现与排序属性深度耦合的设计描述。passThroughTraits定义 trait 传播逻辑定义给定关系向下传播 trait 的逻辑。部分节点只是简单转发 traits但设计文档指出大多数关系使用自定义的 trait 传播逻辑——这正说明每个物理算子的属性约束各不相同默认转发远不能满足需求。derive向上冒泡属性将子关系的 trait 向上冒泡bubble up给给定关系。它是passThrough的逆过程用于让父算子了解子算子实际能提供哪些物理属性。deriveTraits定义 trait 派生逻辑定义 traits 的向上派生逻辑。文档给出的经典场景是当选择了已排序的 Index Scan且该排序正是由Sort关系请求的 collation 时由于冗余Sort关系可以直接被消除eliminated——排序需求已被索引天然满足无需额外排序算子。这四个方法共同构成 CASCADES 中属性请求-属性满足闭环也是任何接入 Top-Down Optimizer 的引擎必须补齐的工作量。Hazelcast SQL 现有优化管线三阶段结构要理解集成冲突必须先看清 Hazelcast以 5.2.0 状态为准自身的优化管线。设计文档将其划分为三个阶段第一阶段无条件的关系树重写无条件执行的树改写例如Project - Calc、Filter - Calc等转换。这一阶段不依赖任何物理属性是纯结构性的规范化。对应源码可见CalcLogicalRule、CalcMergeRule等规则opt/logical 目录。第二阶段逻辑优化阶段默认的 Calcite 关系树NONEconvention被重写为LOGICALconvention并伴随少量关系转置transposition或合并merge。例如引入受限扫描constrained scan、谓词下推等 Hazelcast 特有优化。该阶段由LogicalRules.getRuleSet()驱动见 CalciteSqlOptimizerImpl.java 的optimizeLogical。第三阶段物理优化阶段带LOGICALconvention 的逻辑树被重写为PHYSICALconvention并应用大量实现特定的优化规则为扫描选择访问方法普通扫描 vs. 索引扫描、从子节点向上传播物理属性、根据子节点物理属性选择父算子实现本地/分布式排序、阻塞/流式聚合、hash join/merge join 等以及必要时的 exchange 算子强制见 CalciteSqlOptimizer.java 的类注释。在仓库实现中LOGICAL与PHYSICAL两种 convention 定义于 Conventions.javaPHYSICAL约定通过重写canConvertConvention与useAbstractConvertersForConversion确保每当新的PHYSICAL子节点产生时父LOGICAL节点的规则被重新调度从而模拟 Cascades 风格的自底向上属性拉取——这是当前 Volcano 方案下弥补属性传播困难的关键技巧但代价是同一规则可能被重复触发增加优化耗时。物理优化完成后还会通过 HEP planner 执行postOptimizationRewrites如AssignDiscriminatorToScansRule与CalcLimitTransposeRule见 CalciteSqlOptimizerImpl.java 的postOptimizationRewrites方法。集成冲突的核心规则被过早应用三阶段管线与 Top-Down Optimizer 的碰撞点非常明确Top-Down Optimizer 会在第一次 convention 转换时即 Hazelcast 场景中的NONE - LOGICAL立即应用规则。也就是说CASCADES 风格的 top-down 优化器要求物理化从第一次 convention 转换就一步到位地展开而 Hazelcast 的架构刻意将逻辑优化与物理优化拆成两段独立流程。前者需要先完成与实现无关的规范化如Calc合并、谓词下推后者才关心实现选择。立即应用规则的行为模式与这套两阶段设计天然冲突——逻辑阶段的规则会与物理阶段的规则在同一轮中混杂触发破坏阶段边界。PhysicalRel在仓库中目前只是一个标记接口 少量默认方法见 PhysicalRel.java并未实现 CASCADES 的PhysicalNode四方法协议这与文档迁移仅部分实现的表述相互印证。三种备选方案及其失败原因针对上述限制SQL 团队尝试了三条绕行路径逐一评估后全部放弃方案一逻辑阶段改用 HEP planner —— 失败思路是在逻辑优化阶段使用 HEP启发式planner而非 Volcano/Columbia。失败原因HEP planner 按严格顺序穷举式地应用规则而逻辑阶段不存在一个唯一正确的规则顺序能让所有规则都正确工作。规则的依赖关系如先合并再下推在 HEP 的固定顺序下无法保证产物正确性不可控。方案二逻辑与物理阶段分别使用独立的 Volcano planner —— 不可行思路是保持两阶段但各配一个 Volcano planner。失败原因这在 Calcite 中根本行不通——Calcite 的实现要求所有优化由且仅由一个 planner 完成一个RelNode树的优化流程无法拆给多个 planner 接力。这是 Calcite 的框架实现特性属于硬约束。方案三彻底去掉逻辑阶段把强制规则全部并入物理阶段 —— 成本过高思路是取消NONE - LOGICAL阶段所有强制规则推迟到物理阶段统一处理。失败原因这需要大量工程投入且伴随高风险而从功能价值feature value角度看毫无回报——纯属为适配优化器而重构架构不解决任何用户可见的问题。基于成本收益分析该方案被否决。结论综合以上分析Hazelcast SQL 团队决定推迟所有优化器升级方向的研究。这不是否定 Columbia 优化器的能力而是承认其 top-down 语义与当前两阶段架构之间的结构性错配无法低代价弥合。未来变更可复用的部分实现值得注意的是该设计文档TDD头部提到的 Pull Request 中已经部分实现了向 Top-Down Optimizer 的迁移。这段代码已经就绪可供未来任何优化器升级努力直接复用——包括但不限于各物理关系的passThrough/deriveTraits自定义逻辑、Full Scan - Index Scan的基于 collation 的转换原型等。仓库中的测试基础设施如 OptimizerTestSupport.java 及其派生测试 CalcOptimizerTest.java、LimitOffsetScanOptimizerTest.java提供了对逻辑/物理优化结果进行断言验证的现成手段未来复现该实验时可直接沿用。经验总结一次有价值的负面设计探索这篇 REJECTED 文档的价值恰恰在于如实记录了失败路径概念差异要先行澄清Hazelcast 的物理关系与 CASCADES 的物理节点含义不同任何接入工作前必须先统一术语避免实现错位框架硬约束要提前确认Calcite 要求单一 planner 完成全部优化这是无法绕过的架构事实多 planner 接力方案从一开始就不可行阶段拆分是有代价的架构选择Hazelcast 三阶段管线让逻辑规范化与物理选择解耦但同时也与 top-down 优化器的首次转换即全面物理化语义冲突这是本次探索失败的根本原因HEP 的穷举顺序问题启发式 planner 无法保证多规则的正确触发顺序不能简单替代逻辑阶段成本收益是决策底线即便技术上可行方案三若功能价值不足以覆盖重构风险理性的工程决策就是搁置。对于研究 Hazelcast SQL 优化器实现尤其是 opt/logical 与 opt/physical 两个目录的规则集的开发者来说这份反馈文档连同 CalciteSqlOptimizer.java 的详细类注释是目前最权威的第一手设计史料——它解释了为什么 Hazelcast 至今仍在使用 Volcano planner 的规则驱动优化也为未来可能的优化器升级划定了清晰的约束边界。赞分享缓存KV存储消息队列流处理后端【免费下载链接】hazelcastHazelcast is a unified real-time data platform combining stream processing with a fast data store, allowing customers to act instantly on>项目地址https://gitcode.com/gh_mirrors/ha/hazelcast点击查看免费下载相关推荐如何快速上手Intern-S2-Preview5分钟入门科学AI模型如何快速上手Intern S2 Preview5分钟入门科学AI模型 想要快速掌握Intern S2 Preview这款强大的350亿参数科学多模态基础模型吗上一篇从卡顿到丝滑Next.js Vercel预览部署如何重塑团队协作下一篇Tridactyl安装与配置10分钟打造高效浏览环境创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考