Apache Calcite

前言
之前的名称叫做 optiq,optiq 起初在 Hive 项目中,为 Hive 提供基于成本模型的优化,2014 年 5 月 optiq 独立出来,成为社区的孵化项目,主要作用是提供标准的SQL语言查询底层各种数据源的一个工具,可以将各种SQL语句解析成抽象语法术AST(Tree),之后通过操作AST就可以把SQL中所要表达的算法与关系体现在具体代码之中 。
的目标是"one size fits all "(一种方案适应所有需求场景),希望能为不同计算平台和数据源提供统一的查询引擎,成为动态的数据管理系统(其实并没有数据库,需要我们在代码里告诉,虚拟出来的表是什么、字段是什么、字段类型是什么等,整体抽象为一个个,对于我们来说就查虚拟出来东西,不用关心底层真正对接了哪些数据源),并以类似传统数据库的访问方式(SQL 和高级查询优化)来访问数据 。
使用作为SQL解析与处理引擎有Hive、Drill、Flink、和Storm,可以肯定的是还会有越来越多的数据处理引擎采用作为SQL解析工具 。
特性及功能架构
2种常用场景:
场景2是 最受欢迎的和最擅长的场景,相比查询执行、连接数据源,更擅长的是制造查询语言,解析查询,和查询优化。为什么这么说呢 , 那就要看看它的架构了:
1、SQLand 是的SQL 语言的解释器,它将用户用SQL语言编写的查询解析城,并验证它的合法性。
2、Query(优化器)是 的核心,它接受查询计划,输出优化的查询计划 ,主要包含三个部分:
这三个组件是 可扩展部分,因此与外部系统有连接。
3、黄色框框Data( 简称DPS)与蓝色框框有虚线连接,是DPS 对 的扩展部分 。这里的Data所指的就是场景2里的查询引擎 。它通过扩展和rules , 向优化器提供更准确的元数据信息,更适合的代价模型,更高效的优化规则,利用 优化器产生最优化查询计划 。
4、是一种绕过SQL解析,直接生成关系表达式的工具 。这种方式适用于单元测试 。
用数据流图的方式描述一下 和Data的交互,更容易理解:
解析 SQL,把 SQL 转换成为 AST (Tree,抽象语法树),在中用来表示;

Apache Calcite

文章插图
语法检查,根据数据库的元数据信息进行语法验证,验证之后还是用表示 AST 语法树;
语义分析,根据及元信息构建树,也就是最初版本的逻辑计划( Plan);
逻辑计划优化,优化器的核心,根据前面生成的逻辑计划按照相应的规则(Rule)进行优化;
【Apache Calcite】物理执行,生成物理计划,物理执行计划执行 。
中的概念
1、关系代数表达式:SQL 形式化语言——关系代数的博客-CSDN博客_sql关系代数
2、等价交换原理:「 数据库原理 」查询优化(关系代数表达式优化) -- 猫既吾命
3、两种优化方式:
基于规则的优化器(Rule-Based ,RBO):根据优化规则对关系表达式进行转换,这里的转换是说一个关系表达式经过优化规则后会变成另外一个关系表达式,同时原有表达式会被裁剪掉,经过一系列转换后生成最终的执行计划 。
RBO 中包含了一套有着严格顺序的优化规则,同样一条 SQL,无论读取的表中数据是怎么样的,最后生成的执行计划都是一样的 。同时,在 RBO 中 SQL 写法的不同很有可能影响最终的执行计划,从而影响执行计划的性能 。
基于成本优化(CBO):
基于代价的优化器(Cost-Based ,CBO):根据优化规则对关系表达式进行转换,这里的转换是说一个关系表达式经过优化规则后会生成另外一个关系表达式,同时原有表达式也会保留,经过一系列转换后会生成多个执行计划,然后 CBO 会根据统计信息和代价模型 (Cost Model) 计算每个执行计划的 Cost,从中挑选 Cost 最小的执行计划 。