Apache Calcite查询规划
摘要:本文解析 Apache Calcite 的查询规划与执行管线,包括解析与校验、SQL→Rel 转换、Volcano 优化器与规则、Enumerable 物理执行,以及典型使用方式与最佳实践。文中提供数据流图、活动/状态图,帮助读者快速掌握核心组件的作用与协作关系。
应用场景
- 在任意数据源之上(CSV、JDBC、Elasticsearch、Spark 等)提供统一的 SQL 解析、校验、优化与执行能力。
- 作为查询规划内核嵌入到自研数据库或数据虚拟化系统,继承 Calcite 的规则系统与 trait 机制,实现跨源查询优化。
- 为大数据/流式平台提供 SQL 前端,将 SQL 转为可执行的关系代数并按插件化适配器执行。
学习目标
- 掌握从 SQL 文本到
RelNode的完整转换流程及关键方法:Planner.parse → Planner.validate → Planner.rel → Planner.transform。
- 理解
CalcitePrepareImpl如何创建校验器与规划器,SqlToRelConverter.convertQuery的主流程,VolcanoPlanner.findBestExp的优化收敛。
- 能根据
Frameworks.ConfigBuilder构建最小可用的 Planner,并通过测试示例跑通端到端流程。
目录结构
core/:Calcite 核心模块,包含 planner、rel、sql2rel、tools 等核心代码。
adapter/:各类数据源适配器与 Enumerable 实现,示例在example/与file/。
tools/(位于core/src/main/java/org/apache/calcite/tools):对外提供Planner、Frameworks等门面与配置。
plan/(位于core/src/main/java/org/apache/calcite/plan):规则、Trait、优化器接口与 Volcano 实现。
sql2rel/(位于core/src/main/java/org/apache/calcite/sql2rel):SQL→Rel 转换逻辑与配置。
site/_docs/:官方文档与源码走读,如 SQL→Rel 管线文档。
core/src/test/java/:大量单元测试与示例,展示真实用法与期望计划输出。
关键文件清单
core/src/main/java/org/apache/calcite/tools/Planner.java:对外门面,定义parse/validate/rel/transform等主流程。
core/src/main/java/org/apache/calcite/tools/Frameworks.java:ConfigBuilder构建FrameworkConfig,用于定制 Parser/Validator/Converter/RuleSets 等。
core/src/main/java/org/apache/calcite/prepare/CalcitePrepareImpl.java:创建校验器、规划器、执行绑定;承接 JDBC 等入口。
core/src/main/java/org/apache/calcite/sql2rel/SqlToRelConverter.java:SQL→Rel 顶层入口与递归分派。
core/src/main/java/org/apache/calcite/plan/volcano/VolcanoPlanner.java:Volcano 优化器核心实现与规则驱动。
core/src/test/java/org/apache/calcite/tools/
