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

Oracle Discussion :

Jointure avec JOIN


Sujet :

Oracle

  1. #1
    Membre régulier
    Profil pro
    Auditeur informatique
    Inscrit en
    Janvier 2006
    Messages
    178
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Auditeur informatique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 178
    Points : 85
    Points
    85
    Par défaut Jointure avec JOIN
    Bonjour,

    Je dispose d'une requête SELECT assez lourde avec plusieurs jointures internes et quelques jointures externes
    Mes jointures internes sont faites avec un =
    Mes jointures externes sont faites avec un (+)

    Je me posais la question de savoir si avec des JOIN, cela ne serait pas plus rapide, mais dans tous les tutos que j'ai pu voir les jointures se font dans la clause FROM et non pas WHERE, et là j'ai un peu de mal à comprendre.

    Premièrement : Les JOIN peuvent-ils accélérer le traitement de la requête ?
    Deuxièmement : Comment les écrires dans la requête ?

    Cordialement,
    Nico

  2. #2
    Membre expert

    Profil pro
    Inscrit en
    Février 2006
    Messages
    3 437
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 3 437
    Points : 3 597
    Points
    3 597
    Par défaut
    Je me posais la question de savoir si avec des JOIN, cela ne serait pas plus rapide,
    Pour Oracle, utiliser le mot clé JOIN ou le = dans la clause WHERE ne change rien (JOIN est un standard SQL, c'est tout).

    Mais dans tous les tutos que j'ai pu voir les jointures se font dans la clause FROM et non pas WHERE, et là j'ai un peu de mal à comprendre.
    C'est simplement parce qu'ils utilisent la syntaxe du SQL standard.

    Les JOIN peuvent-ils accélérer le traitement de la requête ?
    Je ne crois pas.
    Comment les écrires dans la requête ?
    Comme vous voulez ...

  3. #3
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut
    Citation Envoyé par pifor
    Pour Oracle, utiliser le mot clé JOIN ou le = dans la clause WHERE ne change rien (JOIN est un standard SQL, c'est tout).
    Tu as déjà vérifier ? Parce que j'ai le sentiment que pour les grosses requêtes ça permet à Oracle de moins permuter pour trouver le bon explain plan et donc parser plus rapidement... du moins, ça me semblerait logique

  4. #4
    Inactif   Avatar de Médiat
    Inscrit en
    Décembre 2003
    Messages
    1 946
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 946
    Points : 2 227
    Points
    2 227
    Par défaut
    Citation Envoyé par Fred_D
    Tu as déjà vérifier ? Parce que j'ai le sentiment que pour les grosses requêtes ça permet à Oracle de moins permuter pour trouver le bon explain plan et donc parser plus rapidement... du moins, ça me semblerait logique
    J'ai migré une application d'une v7 à la v9i avec des jointures entre une tables > 10 000 000 lignes avec une table >1 000 000 lignes ; ayant lu sur dvp que le moteur de base de données ferait un produit cartésien avec l'ancienne syntaxe de la jointure, j'étais très inquiet quant à la quantité de travail à faire pour changer toutes les requêtes, mais lors des tests je n'ai noté aucune différence de performance (au niveau humain, pas à la ms) entre l'ancienne syntaxe et la nouvelle (que je privilégie, néanmoins, ne serait-ce que pour la lisibilité, et le futur (surtout pour les jointures externes)).
    J'affirme péremptoirement que toute affirmation péremptoire est fausse
    5ième élément : barde-prince des figures de style, duc de la synecdoque
    Je ne réponds jamais aux questions techniques par MP

  5. #5
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut
    OK merci pour l'info

    En fait, c'est plus la complexité de la requête que la volumétrie qui importe pendant la phase de parsing, mais le retour est intéressant

  6. #6
    Membre expert

    Profil pro
    Inscrit en
    Février 2006
    Messages
    3 437
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 3 437
    Points : 3 597
    Points
    3 597
    Par défaut
    Fred, non je n'ai pas personnellement vérifié mais si Tom Kyte le dit, c'est très probablement vrai. Voir

    http://asktom.oracle.com/pls/ask/f?p...13430766143199

    D'ailleurs Tom Kyte semble nettement contre l'utilisation du "JOIN naturel"
    (évitons les jeux de mots facile ? )

  7. #7
    Nouveau membre du Club
    Inscrit en
    Novembre 2003
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 39
    Points : 37
    Points
    37
    Par défaut
    Les plan d'exécution de requetes ecrites avec INNER JOIN et avec = sont parfaitement les mêmes.
    Exemple pour l'utilisateur SCOTT/TIGER :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    select distinct e1.ename, e1.empno
    from emp e1, emp e2
    where e1.empno= e2.mgr;
     
    select distinct e1.ename, e1.empno
    from emp e1
    inner join emp e2
    on e1.empno= e2.mgr;
    produisent le même plan de requête et le même temps d'exécution :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    0 	  	SELECT STATEMENT Optimizer=ALL_ROWS (Cost=7 Card=13 Bytes=14 3) 
    1 	0 	    SORT (UNIQUE) (Cost=7 Card=13 Bytes=143) 
    2 	1 	        MERGE JOIN (Cost=6 Card=13 Bytes =143) 
    3 	2 	            TABLE ACCESS (BY I NDEX ROWID) OF 'EMP' (TABLE) (Cost=2 Card=14 Bytes=112) 
    4 	3 	                INDE X (FULL SCAN) OF 'PK_EMP' (INDEX (UNIQUE)) (Cost=1 Card=14) 
    5 	2 	            SORT (JOIN) (Cost= 4 Card=13 Bytes=39) 
    6 	5 	                TABLE ACCESS (FULL) OF 'EMP' (TABLE) (Cost=3 Card=13 Bytes=39)
    De même les deux requetes de jointure externe à gauche :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     select distinct e1.ename, e1.empno
     from emp e1, emp e2
     where e1.empno= e2.mgr(+);
     
     select distinct e1.ename, e1.empno
     from emp e1
     left join emp e2 on  e1.empno= e2.mgr;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Execution Plan
    ----------------------------------------------------------
       0      SELECT STATEMENT Optimizer=ALL_ROWS (Cost=27 Card=14 Bytes=1
              96)
     
       1    0   SORT (UNIQUE) (Cost=27 Card=14 Bytes=196)
       2    1     MERGE JOIN (OUTER) (Cost=26 Card=14 Bytes=196)
       3    2       TABLE ACCESS (BY INDEX ROWID) OF 'EMP' (TABLE) (Cost=3 Card=14 Bytes=140)
     
       4    3         INDEX (FULL SCAN) OF 'PK_EMP' (INDEX (UNIQUE)) (Cost=2 Card=14)
     
       5    2       SORT (JOIN) (Cost=23 Card=13 Bytes=52)
       6    5         TABLE ACCESS (FULL) OF 'EMP' (TABLE) (Cost=22 Card=13 Bytes=52)

  8. #8
    Membre confirmé Avatar de chrifo
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    444
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 444
    Points : 481
    Points
    481
    Par défaut
    Oui mais pour rejoindre la remarque de Fred_D, a-t-on moyen de mesurer le temps nécessaire pour trouver le plan d'exécution ?
    L'intérêt me semble limité mais c'est intéressant ...
    Je penche, donc je suis

  9. #9
    Nouveau membre du Club
    Inscrit en
    Novembre 2003
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 39
    Points : 37
    Points
    37
    Par défaut
    Ce que je voulais dire c'était que Oracle traduit exactement de la même façon le INNER JOIN et le = (i.e. lors de la phase de parsing on traduit les deux par un même opérateur). Ensuite pour le résoudre, Oracle fait sa sauce et donc dans les deux écritures il exécute le même plan et prend le même temps pour faire.

  10. #10
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut
    Citation Envoyé par chrifo
    Oui mais pour rejoindre la remarque de Fred_D, a-t-on moyen de mesurer le temps nécessaire pour trouver le plan d'exécution ?
    oui... dans la trace tu t'intéresses au temps du parsing

    pifor : c'est quoi une jointure "naturel"... c'est les = ?

  11. #11
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut
    Citation Envoyé par Mihaela
    il exécute le même plan et prend le même temps pour faire.
    hop hop hop... pas de conclusion attive. C'est pas parce qu'il trouve le même plan (ce qui est heureux quand même ) qu'il a du faire le même nombre de permutations pour le trouver... et donc qu'il a mis le même temps

  12. #12
    Inactif   Avatar de Médiat
    Inscrit en
    Décembre 2003
    Messages
    1 946
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 946
    Points : 2 227
    Points
    2 227
    Par défaut
    Citation Envoyé par Fred_D
    pifor : c'est quoi une jointure "naturel"... c'est les = ?
    NATURAL JOIN = égalité de toutes les colonnes de même nom, donc inutile de les nommer
    J'affirme péremptoirement que toute affirmation péremptoire est fausse
    5ième élément : barde-prince des figures de style, duc de la synecdoque
    Je ne réponds jamais aux questions techniques par MP

  13. #13
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut
    ha oui... il préconise d'indiquer la jointure même si c'est inutile c'est ça ?

  14. #14
    Membre expert

    Profil pro
    Inscrit en
    Février 2006
    Messages
    3 437
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 3 437
    Points : 3 597
    Points
    3 597
    Par défaut
    Je crois que la jointure naturelle, c'est lorsqu'on ne définit pas les colonnes dans la jointure et que le SGBD choisit lui-même les colonnes qui ont les mêmes noms dans les tables pour réaliser la jointure.

    Pas si "naturel" que ça ...

Discussions similaires

  1. Est-ce qu'une jointure avec JOIN est plus rapide que via le WHERE ?
    Par clavier12AZQSWX dans le forum PostgreSQL
    Réponses: 7
    Dernier message: 13/01/2014, 16h31
  2. [8i] Jointures avec JOIN
    Par od.ps dans le forum Oracle
    Réponses: 2
    Dernier message: 19/06/2013, 19h31
  3. probleme de jointure avec left join
    Par carmen256 dans le forum Langage SQL
    Réponses: 4
    Dernier message: 02/09/2010, 12h57
  4. [Sondage] Jointures dans WHERE ou avec JOIN ?
    Par Rei Angelus dans le forum Langage SQL
    Réponses: 29
    Dernier message: 25/08/2006, 10h17
  5. Problème de jointure avec INNER JOIN et LEFT OUTER JOIN
    Par tonio-lille dans le forum Langage SQL
    Réponses: 4
    Dernier message: 10/02/2006, 12h45

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