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

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 464
    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 464
    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
    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 247
    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 247
    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 éprouvé
    Avatar de clavier12AZQSWX
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Avril 2009
    Messages
    1 464
    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 464
    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 997
    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 997
    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 +
    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/ * * * * *

  6. #6
    Modérateur
    Avatar de sevyc64
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    10 247
    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 247
    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 997
    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 997
    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 +
    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/ * * * * *

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

Discussions similaires

  1. Réponses: 11
    Dernier message: 10/09/2012, 04h08
  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, 15h46
  3. Réponses: 6
    Dernier message: 26/09/2008, 10h04
  4. Réponses: 4
    Dernier message: 07/09/2006, 15h41
  5. Jointure avec JOIN
    Par nicocolt dans le forum Oracle
    Réponses: 13
    Dernier message: 12/07/2006, 14h48

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