有没有一种方法可以从联接过滤器和其他过滤器派生等效过滤器?



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_JOINFilterJoinRule.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 子句中有一个谓词,那么它也可以跨和向下传播。

相关内容

最新更新