"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:
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. 8O
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.