Q1:
select * from t1, t2 where t1.a = t2.b and t1.a = 2;
相当于跟随查询。
Q2:
select * from t1, t2 where t1.a = t2.b and t1.a = 2 and t2.b = 2;
现在,我使用Apache Calcites为Q1生成计划,并使用FilterJoinRule.FILTER_ON_JOIN
和FilterJoinRule.JOIN
对其进行优化。但是这些规则不会导出额外的过滤器t2.b = 2
。
是否有任何规则或方法可以在Calcite推导出等效过滤器?感谢。
如果没有,我想支持它。有什么建议吗?
答案 0 :(得分:1)
我认为你需要JoinPushTransitivePredicatesRule或类似的东西。它的工作原理是从连接中的谓词推断RelOptPredicateList并在输入上显示,将这些谓词传播到连接另一侧的列,并在可能的情况下将它们推送到输入。
例如,给定
SELECT *
FROM (SELECT * FROM Emp WHERE deptno >= 10) AS e
JOIN Dept AS d
ON e.deptno = d.deptno
规则可以提取Emp
上的谓词,将其移到整个联接中,然后将其向下推到Dept
,从而产生
SELECT *
FROM (SELECT * FROM Emp WHERE deptno >= 10) AS e
JOIN (SELECT * FROM Dept WHERE deptno >= 10) AS d
ON e.deptno = d.deptno
如果ON子句中有谓词,那么它也可以传播和传播。