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

PostgreSQL Discussion :

Est-ce qu'une jointure avec JOIN est plus rapide que via le WHERE ?


Sujet :

PostgreSQL

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

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Avril 2009
    Messages : 1 442
    Points : 889
    Points
    889
    Par défaut Est-ce qu'une jointure avec JOIN est plus rapide que via le WHERE ?
    bonjour,

    avec Postgresql, est-il vrai qu'une jointure par LEFT JOIN est plus rapide qu'une jointure par produit cartesien ou bien est-ce juste une histoire de normalisation dans le code SQL ?

    par l'exemple , qu'est-ce qui est plus rapide :
    solution a:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT table1.monchamp FROM table1,table2 WHERE table1.cleetrangere=table2.id
    solution b :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT table1.monchamp FROM table1 LEFT JOINT table2 ON table1.cleetrangere=table2.id
    Est-ce vrai dans 100% des cas ou bien ça dépend de certaines choses ?
    quelqu'un a-t-il une idée du facteur de rapidité si c'est différent en vitesse ?

    merci à vous

  2. #2
    Membre expert
    Avatar de alassanediakite
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2006
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Mali

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2006
    Messages : 1 599
    Points : 3 591
    Points
    3 591
    Billets dans le blog
    8
    Par défaut
    Salut
    Tout d'abord le titre doit être revu!
    Pour la question...
    1. LEFT JOIN n'est pas WHERE t1.cle=t2.cleetrangere. Il faut d'autres critères dans le WHERE!
    2. INNER JOIN est identique à t1.cle=t2.cleetrangere; pour PostgreSQL et tout SGBDR intelligent.

    @+

  3. #3
    Modérateur
    Avatar de sevyc64
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    10 233
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 233
    Points : 28 261
    Points
    28 261
    Par défaut
    Question intéressante s'il en est car personnellement je ne me la serais pas posé, persuadé, à tort probablement, que le moteur SQL traduisait les 2 requêtes en un plan d’exécution identique.

    Même remarque que alassanediakite, le produit cartésien tel qu'écrit ici est l'équivalent d'une INNER JOIN pas d'un LEFT JOIN.

    Remarque que je rajoute à l'occasion, parce qu'on le vois aussi trop souvent : Attention aux filtres dans le WHERE sur la seconde table d'une LEFT JOIN qui, si on n'y fait pas bien attention, transforme implicitement une LEFT JOIN en INNER JOIN

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

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Avril 2009
    Messages : 1 442
    Points : 889
    Points
    889
    Par défaut
    j'ai fait un test avec une table1 de 10000 tuples et une table2 de 5000 et je n'ai pas vu différence sur une vielle machine serveur.

    donc, dois-je onclure que soluation a = solution b en terme de rapidité ?

  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 933
    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 933
    Points : 51 748
    Points
    51 748
    Billets dans le blog
    6
    Par défaut
    Sur tout SGBD Relationnel intelligent, le plan d'exécution doit effectivement être le même. Cependant, le calcul dudit plan nécessite plus de travail pour l'algébriseur/optimiseur car le prédicat de jointure est noyé parmi les opérations de restriction. Il faut alors généralement deux passes dans l'arbre algébrique : l'une pour remonter les restrictions en jointures, l'autre pour définir les véritables restriction, sachant que logiquement, les jointures s'effectuent avant les restrictions.

    Donc, l'écriture de jointure dans la clause WHERE pénalise le moteur, mais pas spécialement l'exécution de la requête !

    En tout état de cause, c'est une grande stupidité que de ne pas utiliser le JOIN (opérateur de jointure) pour faire des jointures !

    A +

  6. #6
    Modérateur
    Avatar de sevyc64
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    10 233
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 233
    Points : 28 261
    Points
    28 261
    Par défaut
    Citation Envoyé par SQLpro Voir le message
    En tout état de cause, c'est une grande stupidité que de ne pas utiliser le JOIN (opérateur de jointure) pour faire des jointures !
    Et c'est une grande stupidité que de l'enseigner mais c'est pourtant toujours le cas

  7. #7
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 933
    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 933
    Points : 51 748
    Points
    51 748
    Billets dans le blog
    6
    Par défaut
    Tu sais bien que ça fait longtemps que je tape sur les profs qui continuent d'enseigner cette ignominie !!!!

    A +

  8. #8
    Rédacteur

    Avatar de ok.Idriss
    Homme Profil pro
    IS Consultant
    Inscrit en
    Février 2009
    Messages
    5 220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : IS Consultant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2009
    Messages : 5 220
    Points : 19 450
    Points
    19 450
    Par défaut
    Citation Envoyé par SQLpro Voir le message
    Tu sais bien que ça fait longtemps que je tape sur les profs qui continuent d'enseigner cette ignominie !
    Ça doit être fatiguant à la longue car il me semble qu'ils sont encore très nombreux

    Notamment, je me souviens que ça faisait partie du référentiel national d’examen de la formation du BTS IG autrefois (qui n'existe plus), alors que ça faisait bien 15 ans que 1992 était passé ... et ça n'est qu'un exemple parmi d'autres.

    J'avais eu la chance d'avoir une enseignante nous ayant montré les deux syntaxes tout en indiquant que l'une d'elle est plus récente et préférable mais nous recommandant d'utiliser la vielle syntaxe du WHERE dans l'examen car beaucoup de correcteurs ne sont pas à la page

    Idriss

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

Discussions similaires

  1. Réponses: 11
    Dernier message: 10/09/2012, 05h08
  2. dans quel cas une jointure nested loops est meilleur que hash join?
    Par M_Dandouna dans le forum Administration
    Réponses: 5
    Dernier message: 08/09/2009, 16h46
  3. Réponses: 6
    Dernier message: 26/09/2008, 11h04
  4. Réponses: 4
    Dernier message: 07/09/2006, 16h41
  5. Jointure avec JOIN
    Par nicocolt dans le forum Oracle
    Réponses: 13
    Dernier message: 12/07/2006, 15h48

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