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
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.
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'
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.
Partager