Q1:
select * from t1, t2 where t1.a = t2.b and t1.a = 2;
它等效于遵循查询。
问2:
select * from t1, t2 where t1.a = t2.b and t1.a = 2 and t2.b = 2;
现在,我使用 Apache 方解石生成第 1 季度的计划,并使用FilterJoinRule.FILTER_ON_JOIN
和FilterJoinRule.JOIN
对其进行优化。但是这些规则不会派生出额外的过滤器t2.b = 2
。
是否有任何规则或方法可以得出方解石的等效过滤器?谢谢。
如果没有,我想支持它。有什么建议吗?
我认为你需要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 子句中有一个谓词,那么它也可以跨和向下传播。