2017-05-23 2 views
0

Q1:Gibt es eine Methode, um äquivalente Filter von Join-Filtern und anderen abzuleiten?

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

Es entspricht Abfrage zu folgen.

Q2:

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

Nun verwende ich Apache Calcite Plan für Q1 zu erzeugen und verwenden FilterJoinRule.FILTER_ON_JOIN und FilterJoinRule.JOIN zu optimieren. Aber diese Regeln leiten keinen zusätzlichen Filter t2.b = 2 ab.

Gibt es Regeln oder Methoden, um einen äquivalenten Filter bei Calcite abzuleiten? Vielen Dank.

Wenn nicht, möchte ich es unterstützen. Irgendein Vorschlag?

Antwort

1

Ich denke, Sie brauchen JoinPushTransitivePredicatesRule oder etwas ähnliches. Es funktioniert durch Ableiten eines RelOptPredicateList aus Prädikaten in der Join und auch auf den Eingängen, propagieren diese Prädikate zu den Spalten auf der anderen Seite der Join, und drücken Sie sie auf die Eingänge wenn möglich.

Zum Beispiel gegeben

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

die Regel auf Emp das Prädikat nach oben ziehen, verschieben Sie es über die Verbindung, und es nach unten drücken, bis Dept, was zu

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

Wenn es ein Prädikat in der ON-Klausel, dann könnte es auch über und ab propagiert werden.

Verwandte Themen