有没有一种方法可以从连接过滤器和其他过滤器中导出等效过滤器?
Is there a method to derive equivalent filters from join filters and others?
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_JOIN
和 FilterJoinRule.JOIN
对其进行优化。但是这些规则不会导出额外的过滤器 t2.b = 2
.
是否有任何规则或方法可以在 Calcite 上导出等效滤波器?谢谢。
如果没有,我想支持一下。有什么建议吗?
我认为您需要 JoinPushTransitivePredicatesRule or something similar. It works by inferring a 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 子句中有谓词,那么它也可以传播和传播。
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_JOIN
和 FilterJoinRule.JOIN
对其进行优化。但是这些规则不会导出额外的过滤器 t2.b = 2
.
是否有任何规则或方法可以在 Calcite 上导出等效滤波器?谢谢。
如果没有,我想支持一下。有什么建议吗?
我认为您需要 JoinPushTransitivePredicatesRule or something similar. It works by inferring a 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 子句中有谓词,那么它也可以传播和传播。