IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage SQL Discussion :

Optimisation d'une requête avec jointure multiple


Sujet :

Langage SQL

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mars 2012
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2012
    Messages : 3
    Points : 1
    Points
    1
    Par défaut Optimisation d'une requête avec jointure multiple
    Je me demande comment optimiser une requête avec plusieurs tables père/fils utilisant 2 critères de recherche, l'un sur la table père et l'autre critère sur la dernière table fils.
    Exemple:
    soit les tables Ecole, Classe, Eleve, Note.
    Une Ecole a plusieurs Classes, une Classe plusieurs Eleves, un Eleve plusieurs Notes et la table Note une colonne date_controle.
    Comment optimiser une requête qui recherche toutes les notes avec les critères Ecole.id=? et Note.date_controle > ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT n.id, n.date_controle, n.note, n.id_eleve
    FROM Note n JOIN Eleve e ON e.id=n.id_eleve JOIN Classe c ON c.id=e.id_classe JOIN Ecole ec ON ec.id=c.id_ecole
    WHERE ec.id=? AND n.date_controle > ?
    Avec les clés primaires, on a (1 école * nb classes * nb élèves * nb notes) puis un filtre pour date_controle.
    Avec un index sur date_controle, on a (les notes qui respectent la contrainte de date de TOUTES les écoles) puis un filtre sur l'école.

    Comment faire mieux ?

    merci.

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 242
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 242
    Points : 12 874
    Points
    12 874
    Par défaut
    Bonjour,
    Si toutes les clés étrangères sont indexées (ce qui me semble la moindre des choses), ainsi que les id (clé primaires ?), et que tu as un index sur Note.date_controle, je ne vois pas pourquoi la requête ne serait pas optimisée...
    Quel est le SGBD ? Quel est le plan d'execution ?

    Tatayo.

    PS. je suppose que "n.date_controle > ?" n'est pas à prendre stricto-sensus, mais que tu remplaces "?" par une vraie valeur.

  3. #3
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mars 2012
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2012
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Effectivement, la requête en elle même ne peut pas être optimisée.
    Toutefois, le nombre d'enregistrements manipulés sur la table Note est très important par rapport au nombre d'enregistrements réellement retournés.
    En effet, le sgbd n'a que 2 possibilités pour résoudre cette requête.
    Si on prend 1000 Ecoles avec une moyenne de 30 Classes par Ecole, 30 Elèves par classe, 50 Notes par Elève et 2 notes par semaine par élève.

    Choix 1 de résolution par le sgbd, il utilise l'id de L'école.
    A partir de l'id de l'école, il retrouve les classes de cette école, les élèves de ces classes et enfin les notes de ces élèves. Soit en moyenne 1 école * 30 classes * 30 élèves * 50 notes = 45000 enregistrements de la table Note à parcourir pour retrouver ceux qui respectent la contrainte de date et au final retourner 1800 enregistrements (soit les notes de la dernière semaine).

    Choix 2 de résolution par le sgbd, il utilise l'index sur date_controle.
    Par cet index, il retrouve toutes les notes de la dernière semaine. Soit en moyenne 1000 écoles * 30 classes * 30 élèves * 2 notes = 1800000 enregistrements de la table Note qu'il doit maintenant rattacher à la table Ecole pour retrouver les enregistrements de l'école recherchée (toujours 1800).

    Dans cet exemple, le sgbd choisira bien-sûr le choix 1 de résolution.

    Question: Comment faire mieux.

    idée 1, utiliser une vue. Si je dois passer la requête sur plusieurs Ecoles, créer une vue intermédiaire avec uniquement les notes de la dernière semaine. Mais je ne suis pas sur que ce soit plus efficace.

    idée 2, dénormaliser. Si j'ajoute une colonne id_ecole dans la table Note, je peux ajouter un index sur les colonnes (id_ecole, date_controle) et améliorer considérablement les perfs de ma requête. Mais si je dénormalise ma base pour optimiser à chaque fois les requêtes, je risque de finir avec une base difficile à maintenir non?

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 242
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 242
    Points : 12 874
    Points
    12 874
    Par défaut
    Si tu as un index qui comprend l'id de l'élève et la date, le moteur se basera sur cet index au lieu de parcourir toutes les notes d'un élève.
    Tu peux le vérifier en regardant le plan d'execution.

    Tatayo.

  5. #5
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mars 2012
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2012
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Et bien non, le plan d’exécution montre qu'il n'utilise pas l'index (id_eleve, date_controle). Il prend toujours le choix 1 comme plan d'exécution. C'est peut-être à cause de l'intervalle de temps comme 2ème critère. Cela l'oblige à parcourir trop d'éléments de l'index.

  6. #6
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 950
    Points : 5 849
    Points
    5 849
    Par défaut
    Peux tu fournir les précisions demandées par tatayo :
    Citation Envoyé par tatayo Voir le message
    Si toutes les clés étrangères sont indexées (ce qui me semble la moindre des choses), ainsi que les id (clé primaires ?)
    Citation Envoyé par tatayo Voir le message
    Quel est le SGBD ? Quel est le plan d'execution ?
    Dèjà tu n'as pas besoin de la table ecole et filtrer directement sur c.id_ecole
    Après comme tu ne sélectionnes que des lignes de la table note, tu peux envisager une sous-requête IN ou EXISTS.

  7. #7
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 386
    Points
    18 386
    Par défaut
    Parler d'optimisation sans évoquer le SGBD ni ne donner aucun temps de référence n'a pas de sens.

  8. #8
    Membre chevronné
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Points : 1 806
    Points
    1 806
    Par défaut
    Citation Envoyé par lucas52 Voir le message
    Et bien non, le plan d’exécution montre qu'il n'utilise pas l'index (id_eleve, date_controle). Il prend toujours le choix 1 comme plan d'exécution. C'est peut-être à cause de l'intervalle de temps comme 2ème critère. Cela l'oblige à parcourir trop d'éléments de l'index.
    Il faudrait voir les plans d'exécution (et connaitre le SGBD) pour aller plus loin. Cependant avec un index (date_controle,id_eleve) on peut s'attendre à ce qu'il fasse un scan range puis un hash join d'index.

Discussions similaires

  1. optimisation d'une requete de jointure multiple
    Par M_Dandouna dans le forum SQL
    Réponses: 17
    Dernier message: 02/01/2008, 21h54
  2. [SQL 2000] Optimisation requête avec jointure multiple
    Par zooffy dans le forum Développement
    Réponses: 5
    Dernier message: 18/09/2007, 15h38
  3. [SQL 2000] Optimisation requête avec jointure multiple
    Par zooffy dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 18/09/2007, 15h38
  4. [ABAP] Comment créer une requête avec jointure
    Par roadster62 dans le forum SAP
    Réponses: 1
    Dernier message: 21/02/2006, 16h04
  5. optimisation d'une requête avec jointure
    Par champijulie dans le forum PostgreSQL
    Réponses: 8
    Dernier message: 07/07/2005, 09h45

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo