Bonjour,
Suite à un retour client sur un problème de performance, j'ai trouvé une requête ayant la forme suivante :
Par un excès de zèle, je me suis parmis de simplifié la requête en :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 Select * from TableA where TableA.ChampsA = 42 and TableA.ChampsB in (select ChampsB from TableB where TableA.ChampsB = TableB.ChampsB and TableB.ChampsC = 40)
Ce qui divise par un facteur 100 le temps de réponse sur mon jeu de donnée.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 Select * from TableA where TableA.ChampsA = 42 and TableA.ChampsB in (select ChampsB from TableB where TableB.ChampsC = 40)
Cependant, je ne suis pas sûr de la raison de cette amélioration de performance. Selon moi, la première requête réalise la sous requête à chaque ligne pour faire le match sur TableA.ChampsB = TableB.ChampsB. Et donc le retrait de la condition rends la sous requête statique par rapport à la requête principale. Ce qui fait qu'on ne perds plus de temps sur des sous requêtes inutiles.
Cependant, je reste perplexe quant à la raison qui a poussé le créateur de la requête d'ajouter cette contrainte. En particulier quand je constat le degré de maitrise du langage sur le reste de la requête. (La requête réelle fait une page).
Si il y a une personne qui peut me confirmer ou m'infirmer ma supposition sur la raison de l’amélioration des performances. Ou si vous avez une idée sur l'origine de cette contrainte sur la sous-requête... n'hésitez pas !
Cordialement,
Patrick Kolodziejczyk.
Partager