[9i][Optimisation] Optimiser une requete
Bonjour à tous, j'ai une grosse requete qui prend du temps et j'aimerais la réduire.
J'ai d'abord identifié en analysant l'Explain Plan qu'il y avait un MERGE CARTESIAN en accès full à Minuscule_Table lors de la jointure entre Enorme_Table et Minuscule_Table. J'ai donc créé 2 index, 1 sur Minuscule_Table et 1 sur Enorme Table sur leurs champs utilisés pour la jointure entre ces 2 tables et ça a bien fait disparaître le MERGE CARTESIAN.
Malheureusement ça n'a pas vraiment amélioré les temps (je suis passé de 45mn à 35mn, pas terrible), donc ce n'est pas vraiment ça le problème. Il n'y a pas si longtemps, cette (presque) même requête tournait en 3mn, j'ai depuis ré-organisé la requête et je ne sais pas ce qui pose problème, mais je trouverais. J'ai bien l'intention de décortiquer cette requête en partant de la base et en testant jusqu'à ce que j'arrive à trouver ce qui la perturbe, mais si quelquechose vous frappe, merci de me prévenir (parce que moi c'est mon boss qui me frappe mais ceci est une autre histoire...).
La requête :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
|
SELECT
DISTINCT
Grosse_Table.Identifiant1,
Grosse_Table.Identifiant2,
Grosse_Table.Identifiant3,
Grosse_Table.Identifiant4,
Grosse_Table.Identifiant5,
Enorme_Table.Identifiant6,
Minuscule_Table.Valeur1
FROM
Enorme_Table Enorme_Table,
Grosse_Table Grosse_Table,
Minuscule_Table Minuscule_Table
WHERE
Grosse_Table.Identifiant1 = Enorme_Table.Identifiant1 AND Grosse_Table.Identifiant2 = Enorme_Table.Identifiant2
AND Enorme_Table.Identifiant1 = Minuscule_Table.Identifiant1 and Enorme_Table.Identifiant6 = Minuscule_Table.Identifiant6
AND Grosse_Table.Identifiant1 IN (130, 290)
AND Grosse_Table.debut_date >= :0
AND Grosse_Table.debut_date <= :1
AND Grosse_Table.fin_date >= :0
AND Grosse_Table.fin_date <= :1
AND Enorme_Table.action_date >= :0
AND Enorme_Table.action_date <= :1
AND Grosse_Table.annulée = 0
AND Grosse_Table.livrée = 'EC'
AND Grosse_Table.Identifiant5 IS NULL
AND Grosse_Table.Identifiant4 IS NULL
AND Minuscule_Table.Identifiant7 = 'C' |
Et l'explain plan :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
|
14 SELECT STATEMENT
13 SORT [UNIQUE]
12 FILTER
11 Grosse_Table TABLE ACCESS [BY INDEX ROWID]
10 NESTED LOOPS
7 NESTED LOOPS
3 INLIST ITERATOR
2 Minuscule_Table TABLE ACCESS [BY INDEX ROWID]
1 I_Minuscule_Table INDEX [RANGE SCAN]
6 INLIST ITERATOR
5 Enorme_Table TABLE ACCESS [BY INDEX ROWID]
4 I_Enorme_Table INDEX [RANGE SCAN]
9 INLIST ITERATOR
8 I_Grosse_Table INDEX [RANGE SCAN] |
merci thanks ++