Ce chapitre traite comment optimiser les sous-requêtes corrélées. L’inconvénient de la sous-requête corrélée vient du fait que celle-ci effectue plusieurs fois le même calcul, ce qui s’avère inefficient.
On va voir une technique qui combine table dérivée et auto-jointure (jointure avec la même table) aux fins d’optimisation.
1. Sous-requête corrélée
Reprenons l’exemple que nous avons vu à propos des sous-requêtes corrélées. On voulait alors obtenir les données à propos de l’employé le plus ancien pour chaque département.
SELECT dep.Name AS Department, emp.First_name, emp.Last_name, emp.Start
FROM Employee AS emp, Department AS dep
WHERE emp.Department_ID = dep.ID AND emp.Start = (
SELECT MIN(e.Start)
FROM Employee AS e
WHERE e.Department_ID = emp.Department_ID
)
On obtient le tableau suivant.
{{h}} |
---|
{{r}} |
2. Optimisation
Prenons une approche inverse. Plutôt que de calculer à chaque fois la date minimale pour un département donné dans le WHERE
, calculons en premier toutes les dates minimales par département et stockons-les dans une table dérivée. Ensuite, nous faisons une auto-jointure pour filtrer par date mininale.
L’astuce consiste à utiliser Start et Department_id comme clés pour effectuer l’auto-jointure.
SELECT D.Name AS Department, e.First_name, e.Last_name, e.Start
FROM (
SELECT e.Department_id AS Dep_id, MIN(e.Start) AS Start
FROM Employee AS e
GROUP BY e.Department_id
) AS Min_start_by_dep, Employee AS e, Department AS D
WHERE Min_start_by_dep.Start = e.Start AND e.Department_id = Min_start_by_dep.Dep_id AND e.Department_id = D.ID
On obtient le tableau suivant.
{{h}} |
---|
{{r}} |