2017-05-23 28 views
0

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方解石來生成Q1的計劃,並使用FilterJoinRule.FILTER_ON_JOINFilterJoinRule.JOIN優化它。但是這些規則不會派生出額外的過濾器t2.b = 2

是否有任何規則或方法可以在Calcite中派生等價的過濾器?謝謝。

如果不是,我想支持它。任何建議?

回答

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子句中的一個謂詞,然後它可以傳播到另一個。

相關問題