Deux arbres algébriques peuvent calculer exactement le même résultat en produisant des quantités de lignes intermédiaires très différentes. C'est là-dessus qu'un optimiseur travaille.
La question posée
Les projets du client dont le nom est Moreau, à partir des relations Client (quatre lignes) et Projet (quatre lignes). Un seul client porte ce nom, et il a un seul projet.
Les deux arbres
L'ordre naïf traduit la question mot à mot : associer tous les clients à tous les projets, garder les associations cohérentes, puis retenir celles de Moreau.
σ_{nom = 'Moreau'} ( Client ⨝ Projet )
L'ordre optimisé filtre d'abord :
σ_{nom = 'Moreau'}(Client) ⨝ Projet
Objectif
Compter les lignes que produit l'association dans chacun des deux ordres, vérifier que le résultat final est identique, et chiffrer ce que la réécriture économise.
Rappels
Cette réécriture porte un nom : pousser les sélections vers les feuilles de l'arbre. Elle est valable parce que filtrer sur un attribut d'une seule relation avant ou après l'association donne le même résultat.