0

Q1:

select * from t1, t2 where t1.a = t2.b and t1.a = 2;

相当于follow query。

Q2:

select * from t1, t2 where t1.a = t2.b and t1.a = 2 and t2.b = 2;

现在,我使用 Apache Calcites 为 Q1 生成计划,并使用FilterJoinRule.FILTER_ON_JOINFilterJoinRule.JOIN优化它。但是这些规则并没有派生出额外的过滤器t2.b = 2

是否有任何规则或方法可以在 Calcite 导出等效过滤器?谢谢。

如果没有,我想支持它。有什么建议吗?

4

1 回答 1

1

我认为您需要JoinPushTransitivePredicatesRule或类似的东西。它的工作原理是从连接中的谓词推断一个RelOptPredicateList并出现在输入上,将这些谓词传播到连接另一侧的列,并在可能的情况下将它们下推到输入。

例如,给定

SELECT *
FROM (SELECT * FROM Emp WHERE deptno >= 10) AS e
JOIN Dept AS d
    ON e.deptno = d.deptno

该规则可以拉起谓词 on 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 子句中有谓词,那么它也可以向下和向下传播。

于 2017-05-24T18:23:15.957 回答