2017-05-23 4 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; 

今は、私はQ1のためのプランを生成するようにApache方解石を使用し、それを最適化するために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句の述語であれば、それは上下に伝播することもできます。

関連する問題