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

Requêtes MySQL Discussion :

Est-ce qu'un LEFT JOIN avec 2 conditions est plus performant ou pas ?


Sujet :

Requêtes MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Avatar de clavier12AZQSWX
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Avril 2009
    Messages
    1 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Avril 2009
    Messages : 1 506
    Par défaut Est-ce qu'un LEFT JOIN avec 2 conditions est plus performant ou pas ?
    bonjour,

    Je fais un traitement de jointure en 2 tables , une commande et facture. Une commande n'a qu'une seule facture finale.
    La facture contient plusieurs version mais je n'ai besoin que de la dernière (celle pas en etat 'versionning')
    J'ai énormément de données "versionning" dans ma table facture.

    je voudrais savoir si faire une jointure à 2 critères permet de réduire les ressources de traitement de la requete même si la condition 1 est suffisante.

    exemple simplifiée du schéma et des données:

    table COMMANDE

    com_id com_montant com_ com_facture
    -----------------------------------------------------
    c1 10 f5
    c2 20 f6
    c3 30 f7


    table FACTURE

    fac_id fac_com_id fac_statut
    -----------------------------------------------------
    f1 null versionning
    f2 null versionning
    f3 null versionning
    f4 null versionning
    f5 c1 officielle
    f6 c2 officielle
    f7 c3 officielle
    f8 null versionning
    f9 null versionning
    f10 null versionning


    En gros, est-ce que cette requête R1 est meilleure :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    SELECT * FROM 
    commande LEFT JOIN facture ON com_id =fac_com_id

    que cette autre requête R2 à deux conditions de jointure gauche :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT * FROM 
    commande LEFT JOIN facture ON (com_id =fac_com_id AND fac_statut='officielle')


    Comme je l'ai dit, la condition com_id =fac_com_id suffit à faire la jointure, mais comme la table externe FACTURE contient bcp de données, je me dis que la filtrer pour la jointure serait une bonne idée, donc en ajoutant AND fac_statut='officielle'

    qu'en pensez-vous ?

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 009
    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 : 22 009
    Billets dans le blog
    6
    Par défaut
    ça ne donne pas les mêmes résultats !

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  3. #3
    Membre éprouvé
    Avatar de clavier12AZQSWX
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Avril 2009
    Messages
    1 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Avril 2009
    Messages : 1 506
    Par défaut
    Citation Envoyé par SQLpro Voir le message
    ça ne donne pas les mêmes résultats !

    A +
    oh là, vous me faites douter là.

    com_id =fac_com_id est une condition suffisante, et à chaque fois qu'elle est remplie fac_statut est déjà à 'officielle'.
    avec ou sans le "AND fac_statut='officielle'" , les résultats sont identiques.
    non?

    si dans cet exemple :
    Nom : sql-left-join-example.jpg
Affichages : 310
Taille : 122,4 Ko

    je rajoute dans la table GENDERS le tuple :
    4 "robot"

    et que j'utilise la condition de jointure gauche :
    ON (employees.GenderID=genders.genders.id AND genders.genders.gender<>'robot')

    alors, les résultats (les 3 lignes) seront identiques à l'exemple , non ?

    LA seconde condition "AND genders.genders.gender<>'robot'" est inutile, je l'ajoute juste pour limiter le Nb de lignes brassées.
    Je me trompe ?

  4. #4
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2013
    Messages
    4 241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2013
    Messages : 4 241
    Par défaut
    Quels sont les index ou les clés sur ta table 'facture' ?
    Si tu as une clé composée sur (fac_statut, fac_com_id) (dans cet ordre), alors oui, il faut ajouter le filtre sur fac_statut.
    Dans tous les autres cas, je pense que ça ne changera à peu près rien.

  5. #5
    Membre éprouvé
    Avatar de clavier12AZQSWX
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Avril 2009
    Messages
    1 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Avril 2009
    Messages : 1 506
    Par défaut
    Citation Envoyé par tbc92 Voir le message
    Quels sont les index ou les clés sur ta table 'facture' ?
    Si tu as une clé composée sur (fac_statut, fac_com_id) (dans cet ordre), alors oui, il faut ajouter le filtre sur fac_statut.
    Dans tous les autres cas, je pense que ça ne changera à peu près rien.
    que des indexes séparés, rien de composé.

    Ok, donc dans la table fille "FACTURES", je peux avoir 99% de données inutiles, ça ne me sert à rien de les évincer en ajoutant la condition secondaire AND fac_statut='officielle' dans mon critère de liaison ON ?
    Pourquoi j'ai dans ma tête le souvenir que ça permettait au moteur SQL de brasser moins de données avant de faire la jointure et que ça consommerait moins de ressources... ? Juste de la théorie de cours et jamais factuel en pratique ?

  6. #6
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2013
    Messages
    4 241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2013
    Messages : 4 241
    Par défaut
    Je comprends que tu as 2 indexes sur cette table.
    Peut-être que Mysql fait exception, mais en principe, le moteur va utiliser un index, et un seul.
    Si tu précises " and fac_statut='officielle' ", le moteur peut être tenté de passer par cet index ; hop, il élimine 90% des données, c'est tentant. Mais ensuite, il doit parcourir toutes les lignes pour chercher la seule et unique ligne qui a l'identifiant cherché.
    Si tu ne précises pas 'and fac_statut='officielle' ", le moteur va utiliser l'index sur fac_com_id, ça va l'emmener directement à LA ligne cherchée (une au maximum, donc pas besoin de l'aider plus).

    Si tu as la possibilité de modifier l'index, une clé composée sur fac_statut, fac_com_id (dans cet ordre) serait utile. La recherche dans l'index sera plus rapide, parce que très vite, le moteur ira dans la partie de l'index consacrée à fac_statut='officielle', et la recherche de la ligne utile se fera dans un espace 10 fois plus petit, et toujours avec une technique de type 'index', et pas de lecture séquentielle en lisant toutes les lignes.

    Mais évidemment, ajouter cette clé composée, ça a un coût, ce n'est pas forcément une bonne idée.

    En fait, l'index sur fac_statut est à peu près sans intérêt. Ca permet d'isoler rapidement les lignes selon fac_statut, ok, mais j'imagine qu'on a systématiquement besoin de faire aussi un lien avec une autre table sur fac_com_id. Et si le système choisit d'utiliser cet index sur fac_statut, il se prive de l'index sur fac_com_id.

Discussions similaires

  1. Left join avec une condition dans l'autre table
    Par rj450 dans le forum Requêtes et SQL.
    Réponses: 8
    Dernier message: 22/02/2013, 17h50
  2. Faire un Left join avec pro*C
    Par xoum89 dans le forum SQL
    Réponses: 4
    Dernier message: 15/05/2009, 08h54
  3. left join avec max(date)
    Par supernicoco dans le forum Langage SQL
    Réponses: 2
    Dernier message: 02/10/2008, 09h53
  4. Left join avec 3 tables
    Par MathiasMathias dans le forum Langage SQL
    Réponses: 1
    Dernier message: 10/04/2007, 01h45
  5. LEFT JOIN avec Oracle 8i ne va pas... doit utiliser (+)
    Par loikiloik dans le forum Langage SQL
    Réponses: 10
    Dernier message: 21/04/2004, 17h38

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