Optimisation requetes SQL
Bonjour,
Je suis aujourd'hui confronté à des pb de temps de réponses sur certaines requetes, malgré la pose d'index, de tables en mémoire, etc... :cry: :cry:
Voici le code d'une des requetes :
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
lower(SUPRALOCAL.REF),
sum(decode(DO0.VAR13,'Gagnée',1,0)),
XORGALIEN_Supra.ID_PC,
sum(decode(DO0.ETAT,'Clôturée', 1,0)),
sum(decode(DO0.ETAT,'En cours', 1,0))
FROM
XORGALIEN XORGALIEN_Supra,
DO0,
SO0,
AR0,
AR0 SUPRALOCAL
WHERE
( SO0.AR0_NRID=AR0.NRID )
AND ( SUPRALOCAL.NRID=AR0.AR0_SUPRA_NRID )
AND ( XORGALIEN_Supra.CODE_INSEE=SUPRALOCAL.CDE_TVA )
AND ( SO0.NRID=DO0.SO0_NRID )
AND ( SO0.TYPE='Particulier' )
AND ( DO0.DAT1 >= to_date('01/01/'||TO_CHAR(sysdate,'YYYY'),'DD/MM/YYYY') )
AND (
( lower(SUPRALOCAL.CATEGORIE)='extension' )
AND ( SUPRALOCAL.nrid in (select ar0_supra_nrid from ar0
where ar0_supra_nrid is not null) )
AND trunc(DO0.DAT1) >= '01-07-2002 00:00:00'
AND SO0.TYPE = 'Particulier'
)
GROUP BY
lower(SUPRALOCAL.REF),
XORGALIEN_Supra.ID_PC |
Cette requête va mettre jusqu'à 40MN !!!! :x
Voici pour info l'explain PLAN :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
|
SELECT STATEMENT Optimizer Mode=CHOOSE 1 10835
SORT GROUP BY 1 114 10835
NESTED LOOPS 1 114 10821
HASH JOIN 1 106 10817
NESTED LOOPS 19 1 K 10021
NESTED LOOPS 1 K 87 K 7497
NESTED LOOPS 1 K 73 K 4973
TABLE ACCESS FULL DO0 1 K 37 K 2445
TABLE ACCESS BY INDEX ROWID SO0 23 M 671 M 2
INDEX UNIQUE SCAN PK_SO0 23 M 1
TABLE ACCESS BY INDEX ROWID AR0 26 M 280 M 2
INDEX UNIQUE SCAN PK_AR0 26 M 1
TABLE ACCESS BY INDEX ROWID AR0 26 K 855 K 2
INDEX UNIQUE SCAN PK_AR0 26 K 1
VIEW VW_NSO_1 18 K 36 K 795
SORT UNIQUE 18 K 36 K 795
INDEX FAST FULL SCAN IDX_AR0_AR0_SUPRA_NRID 396 K 774 K 124
TABLE ACCESS BY INDEX ROWID XORGALIEN 36 K 285 K 4
INDEX RANGE SCAN SEL_XORGALIEN 36 K 2 |
En résumé, la requête passe par les index (pour les grosses tables 31M de lignes), et fait des Full Scan sur de petites tables.
Comment puis je optimiser cette requête ?
merci d'avance pour vos solutions.