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

SQL Oracle Discussion :

"Outer join" plus rapide que "inner join"


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Juin 2003
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 25
    Par défaut "Outer join" plus rapide que "inner join"
    Bonjour,

    j'ai constaté un phénomène qui m'a étonné et j'aimerais savoir si quelqu'un peut me l'expliquer.

    J'ai une requête qui mettait plus de 20 minutes à s'exécuter alors qu'elle est très simple dans le principe: retrouver tous les articles d'une commande. Voici le principe de la requête
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    select no_commande, no_article, tx_tva
    from 
      (select * from commandes) c,
      (select * from ligne_commande inner join tva on ligne_commande.code_tva = tva.code_tva) lc,
      (select * from articles) a
    where c.no_commande = lc.no_commande
    and a.no_article = lc.no_article(+)
    and c.no_commande='XXXX'
    C'est une version simplifiée de la requête qui est générée par BO à partir d'un univers avec des tables dérivées, d'où les "select from (select...)" et le joyeux mélange entre les jointures à l'ancienne et les jointures ANSI92.
    En remplaçant le "inner join" par "left outer join", le temps d'exécution de la requête est passé à 4 secondes.
    Est-ce que quelqu'un aurait une explication logique à cette soudaine amélioration de performance?

    Petites précisions:
    - la table commande contient 35000 lignes
    - la table ligne_commande contient 100000 lignes
    - la table tva contient 6 lignes
    - la table articles contient 45000 lignes
    - il y a forcément une tva pour chaque ligne de commande (donc le résultat entre une jointure externe et interne est rigoureusement identique)

    Merci d'avance pour votre aide.

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    sans plan d'exécution point de salut

  3. #3
    Membre averti
    Inscrit en
    Juin 2003
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 25
    Par défaut
    N'étant pas un spécialiste Oracle, je ne suis pas sûr que les pièces jointes que j'ai postées sont suffisantes. J'ai utilisé Aqua Data Studio pour les produire.
    Images attachées Images attachées   
    Fichiers attachés Fichiers attachés

  4. #4
    Membre expérimenté
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    207
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 207
    Par défaut
    Bonjour,

    En le "inner join" et "Left outer join" sont différents ! le inner renvoi les lignes qui ont une correspondance dans la tables jointe, alors que le left renvoi également celles qui n'ont pas de correspondance dans la table jointe.
    Il est donc possible que les deux requetes ne renvoient pas le même résultat.
    Ca n'explique pas la différence de temps de réponse puisqu'en théorie le inner join devrait renvoyer moins de ligne que le outer.

    Quelle est la version d'ORACLE utilisée ? je sais qu'en version 9.2.0, il y avait des problèmes de performance avec la norme ANSI
    Laurent.

  5. #5
    Membre averti
    Inscrit en
    Juin 2003
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 25
    Par défaut
    Merci pour ces informations.

    Citation Envoyé par lallio Voir le message
    Il est donc possible que les deux requetes ne renvoient pas le même résultat.
    Comme précisé dans le premier post, il y a un code_tva pour chaque ligne_commande (le champ code_tva est "not null" dans la table ligne_commande).

    Citation Envoyé par lallio Voir le message
    Quelle est la version d'ORACLE utilisée ? je sais qu'en version 9.2.0, il y avait des problèmes de performance avec la norme ANSI
    La version du serveur Oracle est 9.2.0.4.0. Y a-t-il un patch lié à ces problèmes?

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    oui, Oracle 10.2.0.1

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. [D7] composants plus rapides que dbExpress pour Oracle 8i
    Par Magnus dans le forum Bases de données
    Réponses: 2
    Dernier message: 10/10/2005, 12h06
  3. Plus rapide que bresenham ?
    Par mathieu_t dans le forum Algorithmes et structures de données
    Réponses: 3
    Dernier message: 01/06/2005, 13h28
  4. [VB6] timer plus rapide que 1 d'interval
    Par windob dans le forum VB 6 et antérieur
    Réponses: 12
    Dernier message: 24/02/2004, 00h16
  5. Réponses: 8
    Dernier message: 31/10/2003, 16h21

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