Bonsoir,
Le style de vos requêtes, rappelle un de ceux qui était utilisés dans les années quatre-vingts, nécessitant surtout d’avoir un tube d’aspirine à portée de main...
Il faudrait que vous fournissiez la syntaxe précise du langage que vous utilisez. Par exemple, quel rôle joue le point-virgule ? En général il marque la fin du paquet des opérations et c’est la virgule qui sert à délimiter celles-ci.
Évitez de remplacer le nom des opérateurs par des numéros, vos requêtes sont déjà assez hermétiques comme cela.
En attendant, dans le style impératif et de façon informelle, c'est-à-dire si l’on décompose calmement les opérations, celles-ci sont à exécuter dans l’ordre suivant (je donne un nom à chaque résultat intermédiaire : T1, T2) :
1) RESTRICTION : LESFILMS WHERE REALISATEUR = 'Truffaut' AS T1
2) JOINTURE : T1 JOIN LESACTEURS AS T2
3) PROJECTION : T2 {ACTEUR}
Plus précisément, dans le style de Tutorial D (cf. Databases, Types and the Relational Model) :
1 2 3
| WITH (LESFILMS WHERE REALISATEUR = 'Truffaut' AS T1,
T1 JOIN LESACTEURS AS T2) :
T2 {ACTEUR} |
Les opérations peuvent évidemment être exécutées dans un ordre différent, mais avec un rendement beaucoup plus faible sous le capot :
1) JOINTURE : LESFILMS JOIN LESACTEURS AS T1
2) RESTRICTION : T1 WHERE REALISATEUR = 'Truffaut' AS T2
3) PROJECTION : T2 {ACTEUR}
Pour une démonstration de l’équivalence des deux requêtes, reportez-vous aux ouvrages ad-hoc, par exemple Principles of Database Systems de Jeffrey D. Ullman où est effectivement traitée la commutation de la jointure et de la restriction.
Il va sans dire que dans le cas de Tutorial D, c’est au système de juger de l’ordre dans lequel il effectuera les opérations. Si l’on écrit :
1 2 3
| WITH (LESFILMS JOIN LESACTEURS AS T1,
T1 JOIN LESACTEURS AS T2) :
T2 {ACTEUR} |
Il s’ensuit qu’après consultation des statistiques fournies par le catalogue relationnel, il est très probable — performance oblige — que le système optimisera la requête en la réécrivant ainsi (restriction avant jointure, comme plus haut) :
1 2 3
| WITH (LESFILMS WHERE REALISATEUR = 'Truffaut' AS T1,
T1 JOIN LESACTEURS AS T2) :
T2 {ACTEUR} |
N.B. La variable LESFILMS a pour en-tête {TITRE, PAYS, ANNEE, REALISATEUR, DUREE} et dans vos requêtes vous changez les noms des attributs, par exemple REALISATEUR devient réalisateur : ceci n’est possible que si vous disposez d’un opérateur permettant de renommer les attributs.
=>
De la rigueur, toujours de la rigueur, encore de la rigueur...
Partager