
Envoyé par
holderheck
Donc si je comprends bien, les jointures de tables et la projection sont faites lors de l' OPEN CURSOR, le FETCH ne réalisant "que" une lecture de ligne de la projection puis un passage a la ligne suivante ( NEXT étant par défaut ) ?
A l’ouverture du curseur, le système relationnel exécute l’instruction "SELECT ...", laquelle peut donner lieu à plusieurs opérations relationnelles (Restriction, Projection, Jointure, Union, etc.) qui ont toutes pour opérandes des tables. Par exemple, si la première opération est une jointure naturelle : "Table1 Natural Join Table2", Table1 et Table2 sont les opérandes et la jointure produit une table Table3, de même nature que Table1 et Table2. Par métaphore, disons que Table1 et Table2 se marient et le bébé résultant du mariage est de même nature que ses parents, c'est-à-dire qu’à son tour il pourra procréer. Il est évident que ce qui vaut pour ces êtres mathématiques que sont les tables ne vaut pas pour les fichiers (au moins tant qu'on ne disposera pas d'une algèbre ad-hoc...) Cela dit, tout se passe sous le capot et le SELECT précédent peut donner lieu à 36 opérations, sachant que la toute dernière produira la table finale, celle que vous parcourrez par FETCH, exactement comme le plus banal des fichiers, plein pot.
Considérez la requête ci-dessous (cf. http://www.developpez.net/forums/sho...80&postcount=7)
1 2 3 4 5 6 7 8 9
| SELECT ehpFiness
FROM tblehpa20071030
WHERE ehpCodeCategorie = 200
INTERSECT
SELECT DISTINCT a.ehpFiness
FROM tblehpa20071030 a,
tblehpa20071030 b
WHERE a.ehpFinessJuridique = b.ehpFinessJuridique
AND a.ehpFiness <> b.ehpFiness |
D’un point de vue conceptuel, les opérations sont les suivantes :
Dans un 1er temps (à la détection de l’instruction OPEN CURSOR), le système relationnel prend pour opérande la table répondant au doux nom de tblehpa20071030 et récupère les lignes pour lesquelles on vérifie la condition : ehpCodeCategorie = 200.
L’opération est une restriction. Appelons W1 la table qui en résulte.
Dans un 2e temps, le système effectue la jointure des tables tblehpa20071030 et tblehpa20071030 (en fait il s’agit d’une auto-jointure). La condition de jointure est donnée par :
WHERE a.ehpFinessJuridique = b.ehpFinessJuridique
AND a.ehpFiness <> b.ehpFiness
Appelons W2 la table qui en résulte.
Dans un 3e temps, le système procède à l’intersection des tables W1 et W2. Appelons W3 la table qui en résulte.
Dans un 4e temps, le système effectue une projection appliquée à la table W3 pour produire une table W4, laquelle a une seule colonne : ehpFiness. C’est notre table résultat.
Dès que cette table ultime sera constituée, le 1er Fetch sera déclenché et à partir de là, elle sera évidemment parcourue très vite, alors qu’entre l’ouverture du curseur et ce 1er Fetch, il aura fallu au système le temps d’effectuer les travaux préliminaires énumérés ci-dessus.
J’ai décrit les opérations selon un point de vue conceptuel, mais dans la réalité, le système peut évidemment prendre des raccourcis, optimiser, réécrire la requête, son but étant de fournir une table résultat le plus rapidement possible et de la façon la plus économique (W1 ne comportera par exemple que le nombre minimum de colonnes nécessaire, à savoir l’unique colonne ehpFiness).
Il se peut aussi que dans la réalité, le système n’ait pas de table résultat à constituer. Considérez en effet la requête :
1 2
| Select col1, col2
From T1 |
Le système partira bille en tête dans le parcours de T1, sans constitution de tables intermédiaires. Time is money.
Partager