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.

Database schema

Figure 1.1 : schéma de base de données

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}}

Récap

L’optimisation de sous-requêtes corrélées revient à raisonner dans le sens inverse. Plutôt que de faire un calcul à chaque itération (pour chaque ligne), on fait ce dernier une fois pour toutes et on le stocke dans une table dérivée. Ensuite, on fait une auto-jointure avec cette dernière.