AccueilBlogExercice SQL « débugger une requête lente »
Tests prêts à l'emploi

Exercice SQL « débugger une requête lente » : le test live qui révèle le vrai niveau

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é.

Data Builder·Juillet 2025·10 min de lecture·Test SQL · live · débogage / performance

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.

1La requête à débugger

La consigne

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;

    2Les anti-patterns à repérer

    La consigne

    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.

    • (1) La jointure sur des colonnes converties (CAST) empêche l'usage des index.
    • (2) LOWER() sur la colonne filtrée empêche aussi l'index : mieux vaut normaliser en amont.
    • (3) La sous-requête d'AVG peut être recalculée ; et SELECT * ramène des colonnes inutiles.
    • Bon signe : le candidat veut voir le plan d'exécution (EXPLAIN) avant de conclure.

    3Le corrigé

    La consigne

    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).
    • Jointure directe sur les identifiants (mêmes types, index utilisables).
    • Filtre sur une colonne pays normalisée, sans fonction.
    • Moyenne calculée une fois, colonnes explicitement listées.

    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.

    4Grille par niveau

    NiveauMaîtrise attendueSignal GONO-GO
    JuniorRepère SELECT * et un filtre évidentAméliore la lisibilitéChange des choses au hasard
    ConfirméRepère les fonctions bloquant l'indexExplique pourquoi c'est lentCorrige sans comprendre la cause
    SeniorVeut lire le plan d'exécutionDiagnostique avant d'optimiserOptimise à l'aveugle
    LeadPriorise les corrections par impactChiffre le gain et explique clairementNe sait pas justifier ses changements

    Vous recrutez un profil data ?

    Data Builder mène l'entretien technique et vous livre un rapport clair et détaillé sous 24h. Premier entretien offert.

    Tester gratuitementRéserver un appel