2017-05-23 1 views
0

Q1:Existe-t-il une méthode pour dériver des filtres équivalents à partir des filtres de jointure et autres?

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

Il est équivalent à suivre la requête.

Q2:

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

Maintenant, j'utilise Apache Calcites pour générer un plan pour le 1er trimestre, et d'utiliser FilterJoinRule.FILTER_ON_JOIN et FilterJoinRule.JOIN pour l'optimiser. Mais ces règles ne dérivent pas de filtre supplémentaire t2.b = 2.

Existe-t-il des règles ou des méthodes pour dériver un filtre équivalent chez Calcite? Merci.

Sinon, je veux le supporter. Toute suggestion?

Répondre

1

Je pense que vous avez besoin de JoinPushTransitivePredicatesRule ou quelque chose de similaire. Il fonctionne en déduisant un RelOptPredicateList de prédicats dans la jointure et également présents sur les entrées, propageant ces prédicats aux colonnes de l'autre côté de la jointure, et les poussant vers les entrées si possible.

Par exemple, étant donné

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

la règle peut tirer vers le haut le prédicat sur Emp, le déplacer à travers la jointure, et le pousser vers le bas pour Dept, ce qui

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

S'il y avait un prédicat dans la clause ON alors il pourrait être propagé à travers et aussi vers le bas.