多表 Join 查询能力
在构建实时数据分析的场景中,我们常在数据加工的过程中,将多张表通过一些关联字段打平成一张宽表,通过一张表对外提供分析能力,即大宽表模型。其实大宽表依然有它的局限性,一是,生成每一张大宽表都需要数据开发人员不小的工作量,而且生成过程也需要一定的时间;二是,生成宽表会产生大量的数据冗余。
针对宽表模型的局限性,我们从 0 到 1 自研实现了查询优化器,非常好的支持复杂查询的需求,有如下特性:
兼容两种 SQL 语法,支持 ANSI SQL 和原生 CLICKHOUSE SQL ;
支持基于 RBO 优化能力,即支持:列裁剪、分区裁剪、表达式简化、子查询解关联、谓词下推、冗余算子消除、Outer-JOIN 转 INNER-JOIN、算子下推存储、分布式算子拆分等常见的启发式优化能力;
支持基于 CBO 优化能力,基于 Cascade 搜索框架,实现了高效的 Join 枚举算法,以及基于 Histogram 的代价估算,对 10 表全连接级别规模的 Join Reorder 问题,能够全量枚举并寻求最优解,同时针对大于 10 表规模的 Join Reorder 支持启发式枚举并寻求最优解。CBO 支持基于规则扩展搜索空间,除了常见的 Join Reorder 问题以外,还支持 Outer-Join/Join Reorder,Magic Set Placement 等相关优化能力;
分布式计划优化,面向分布式 MPP 数据库,生成分布式查询计划,并且和 CBO 结合在一起。相对业界主流实现:分为两个阶段,首先寻求最优的单机版计划,然后将其分布式化。我们的方案则是将这两个阶段融合在一起,在整个 CBO 寻求最优解的过程中,会结合分布式计划的诉求,从代价的角度选择最优的分布式计划。对于 Join/Aggregate 的还支持 Partition 属性展开。
高阶优化能力,实现了 Dynamic Filter pushdown、单表物化视图改写、基于代价的 CTE (公共表达式共享)。