Calcite是否支持Join场景下的Predicate Push Down谓词下推优化规则
Calcite谓词下推优化规则解答
优化前后SQL样例
原始SQL
SELECT e.* FROM emp e INNER JOIN dept d ON e.deptno = d.deptno AND e.deptno = 5;
注:你提供的原始SQL中emp.deptno未绑定别名,实际运行会报错,此处修正为用别名e指代。
优化后逻辑说明
你提供的优化后SQL存在多处笔误(e.缺字段、表名误写为deptno、重复on关键字),修正后核心逻辑是将deptno=5的谓词分别下推到emp和dept两张表的扫描阶段,提前过滤数据减少join运算的数据集大小,对应SQL如下:
select e.* from ( select * from emp where emp.deptno = 5 ) e inner join ( select * from dept where dept.deptno = 5 ) d on e.deptno = d.deptno;
对应Calcite内置规则说明
Calcite存在完全匹配上述优化逻辑的内置谓词下推规则:
- 核心实现规则为
FilterJoinRule系列,包括FilterJoinRule.FILTER_ON_JOIN、FilterJoinRule.JOIN等子类,专门负责将JOIN节点的关联条件、JOIN上层的过滤条件,下推到JOIN的左右输入子节点中,提前过滤无效数据。 - 针对内连接场景,还可以搭配
JoinPushTransitivePredicatesRule规则使用:该规则可以利用JOIN的等值关联条件推导传递谓词,比如本例中已知e.deptno = d.deptno且e.deptno=5,可以自动推导出d.deptno=5的过滤条件,将两个谓词分别下推到emp和dept的扫描节点,和你给出的优化效果完全一致。
内容的提问来源于stack exchange,提问作者YuKong
相关产品推荐
相关产品推荐

