Rien ne révèle mieux le niveau SQL qu'un débogage en direct. On donne une requête lente et mal écrite, et on observe : le candidat tâtonne-t-il, ou diagnostique-t-il méthodiquement ? Voici l'exercice clé en main, avec les anti-patterns cachés et le corrigé.
L'intérêt de cet exercice est la démarche, pas la réponse. Menez-le en live (partage d'écran) : vous verrez immédiatement qui lit un plan d'exécution et raisonne, et qui change des choses au hasard en espérant que ça aille plus vite.
Présentez cette requête au candidat : « elle est correcte mais très lente, améliore-la ».
Une requête réaliste qui « marche » mais accumule les anti-patterns de performance. Le candidat doit d'abord comprendre ce qu'elle fait, puis identifier pourquoi elle est lente.
-- Requete correcte mais lente : que corrigeriez-vous ?
SELECT *
FROM commandes o
JOIN clients c ON CAST(c.id AS CHAR) = CAST(o.client_id AS CHAR) -- (1)
WHERE LOWER(c.pays) = 'france' -- (2)
AND o.date_commande > DATE_SUB(NOW(), INTERVAL 365 DAY)
AND o.montant > (SELECT AVG(montant) FROM commandes) -- (3)
ORDER BY o.date_commande DESC;Voici ce qu'un bon candidat identifie (numérotés dans la requête).
Trois problèmes principaux se cachent dans cette requête. Un candidat solide les repère et explique pourquoi chacun ralentit l'exécution.
Une version réécrite, plus rapide et lisible.
On ne cherche pas LA requête parfaite mais une version qui lève les blocages : jointure sur les bons types, filtre indexable, sous-requête sortie, colonnes explicites.
-- Version corrigee
SELECT o.id, o.date_commande, o.montant, c.nom
FROM commandes o
JOIN clients c ON c.id = o.client_id -- meme type, index OK
WHERE c.pays = 'France' -- valeur normalisee, index OK
AND o.date_commande >= DATE_SUB(NOW(), INTERVAL 365 DAY)
AND o.montant > :avg_montant -- calcule une fois en amont
ORDER BY o.date_commande DESC;
-- + index sur commandes(date_commande) et clients(pays).Signal d'alerte : ce que ça révèle : un junior modifie des morceaux au hasard ; un senior lit le plan, formule une hypothèse, la teste et explique chaque changement. C'est cette démarche qu'il faut noter.
| Niveau | Maîtrise attendue | Signal GO | NO-GO |
|---|---|---|---|
| Junior | Repère SELECT * et un filtre évident | Améliore la lisibilité | Change des choses au hasard |
| Confirmé | Repère les fonctions bloquant l'index | Explique pourquoi c'est lent | Corrige sans comprendre la cause |
| Senior | Veut lire le plan d'exécution | Diagnostique avant d'optimiser | Optimise à l'aveugle |
| Lead | Priorise les corrections par impact | Chiffre le gain et explique clairement | Ne sait pas justifier ses changements |
Data Builder mène l'entretien technique et vous livre un rapport clair et détaillé sous 24h. Premier entretien offert.