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

时间:2017-05-23 09:00:39

标签: apache-calcite

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_JOINFilterJoinRule.JOIN对其进行优化。但是这些规则不会导出额外的过滤器t2.b = 2

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

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

1 个答案:

答案 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子句中有谓词,那么它也可以传播和传播。