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 :

Performance - Sous requête ou jointure


Sujet :

Langage SQL

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    511
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 511
    Points : 514
    Points
    514
    Par défaut Performance - Sous requête ou jointure
    Bonjour,

    Une petite question de performance. Est-il mieux de faire une jointure ou une sous requête.

    Ex simple avec une table client et une table application. chaque client possède une application. une appli peut être possédé par plusieurs client. Je cherche les clients possédant l'appli 'monappli' :

    1)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Select client 
    from client,application 
    where client.application = application.id 
    and application.nom = 'monappli';
    ou

    2)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Select client 
    from client 
    where application in (select id where application.nom = 'monappli');

  2. #2
    Modérateur
    Avatar de Chtulus
    Homme Profil pro
    Ingénieur
    Inscrit en
    Avril 2008
    Messages
    3 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2008
    Messages : 3 094
    Points : 8 678
    Points
    8 678
    Par défaut
    Bonjour,

    Si déjà vous utilisiez des jointures normalisées !!!


  3. #3
    Membre confirmé Avatar de elbj
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2004
    Messages
    371
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Services à domicile

    Informations forums :
    Inscription : Novembre 2004
    Messages : 371
    Points : 558
    Points
    558
    Par défaut
    MMmmmmh normalisation quand tu nous tiens...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT *
    FROM application A
      JOIN client C ON C.application = A.id 
    WHERE A.nom = 'monappli';
    Sans hésiter je dirai d'éviter les sous-requête. Néanmoins suivant sous quel SGBD vous travaillez, je pense qu'il va "remanier" et "optimiser" votre requête à sa sauce. Personnellement je vous invite à faire des tests et à comparer les résultats.

    Cela dit, si vous voulez des performances ce n'est pas sur les requêtes qu'il faut se pencher en premier mais sur le modèle de données et sur les index.

    Cordialement

  4. #4
    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
    Citation Envoyé par elbj Voir le message
    Sans hésiter je dirai d'éviter les sous-requête. Néanmoins suivant sous quel SGBD vous travaillez, je pense qu'il va "remanier" et "optimiser" votre requête à sa sauce. Personnellement je vous invite à faire des tests et à comparer les résultats.
    Je ne suis pas complètement d'accord avec votre proposition, dans la mesure où la recherche concerne des clients.

    Les sous-requêtes ne posent pas de problème particulier lorsqu'elles sont bien écrites, et qu'on utilise à bon escient IN / NOT IN et EXISTS / NOT EXISTS.

    Dans l'exemple initial la meilleure requête est la seconde, puisque la requête est la transposition exacte du besoin : "Je cherche les clients possédant l'appli 'monappli'".

    La première requête (ou la votre) correspond à : "Je recherche les clients et les détails de leur application lorsqu'il s'agit de 'monappli'".

  5. #5
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 849
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 849
    Points : 52 975
    Points
    52 975
    Billets dans le blog
    6
    Par défaut
    Ces deux requêtes étant équivalentes, elles conduiront en principe au même plan d'exécution et donc aux mêmes performances.

    Le reste n'est qu'une question d'index.

    A +

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    511
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 511
    Points : 514
    Points
    514
    Par défaut
    Merci de vos réponses. En bref les performances sont les mêmes

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème performance sous requête MySQL
    Par Razielwar dans le forum Requêtes
    Réponses: 17
    Dernier message: 23/02/2012, 12h11
  2. Transformer une sous requête en jointure.
    Par ithurts dans le forum Requêtes
    Réponses: 4
    Dernier message: 03/06/2010, 00h26
  3. Réponses: 3
    Dernier message: 25/05/2009, 17h11
  4. Sous-requêtes VS jointures ?
    Par Evocatii dans le forum Langage SQL
    Réponses: 2
    Dernier message: 17/03/2008, 13h57
  5. sous requêtes et jointures externes
    Par Harpoon dans le forum Requêtes
    Réponses: 4
    Dernier message: 03/05/2007, 19h43

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