-
optimisation requête SQL
Bonjour,
Je suis confronté à un problème d'optimisation pour une requête SQL.
Au sein d'une application interactive, je lance un ensemble de requêtes mettant à jour une table Oracle comportant environ 70000 libellés. Le temps de réponse est 2 sec. J'augmente la taille de la table jusqu'à 350000 libellés et le temps de réponse passe à 25 secondes. Comment se fait-il que les temps de réponse se dégradent ainsi très fortement? ( j'ai créé un index sur la table en question ), quels sont les moyens à disposition pour réduire le temp d'accés à la table ?
Merci d'avance
-
Elle est comment la requête ? Est-ce qu'il y a une jointure ? Est-ce que c'est juste un count ou est-ce que tu ramènes des données. Est-ce que tu peux nous donner le plan d'exécution ?
-
Voici un exemple de plan d'execution pour une de mes requêtes( avec ou sans index ) :
------- AVEC INDEX -----------
SQL> update /*+ INDEX(valva, valva_pk) */ valva set valva_sor = 'sdqdq' where upper(idt_valva_enq) =
'PRHTEST' and upper(idt_valva_lot) = 'PCS1' and idt_valva_gpur = 0 and idt_valva_ur = 2 and idt_val
va_lib = 1 and idt_valva_va = 12 ;
1 ligne mise à jour.
Ecoulé : 00 :00 :01.09
Execution Plan
----------------------------------------------------------
0 UPDATE STATEMENT Optimizer=CHOOSE (Cost=27 Card=1 Bytes=69)
1 0 UPDATE OF 'VALVA'
2 1 INDEX (FULL SCAN) OF 'VALVA_PK' (UNIQUE) (Cost=26 Card=1
Bytes=69)
Statistics
----------------------------------------------------------
0 recursive calls
2 db block gets
1684 consistent gets
1684 physical reads
388 redo size
868 bytes sent via SQL*Net to client
765 bytes received via SQL*Net from client
3 SQL*Net roundtrips to/from client
1 sorts (memory)
0 sorts (disk)
1 rows processed
------ SANS INDEX ---------
SQL> update valva set valva_sor = 'sdqdq' where upper(idt_valva_enq) = 'PRHTEST' and upper(idt_valva
_lot) = 'PCS1' and idt_valva_gpur = 0 and idt_valva_ur = 2 and idt_valva_lib = 1 and idt_valva_va =
12 ;
1 ligne mise à jour.
Ecoulé : 00 :00 :01.06
Execution Plan
----------------------------------------------------------
0 UPDATE STATEMENT Optimizer=CHOOSE
1 0 UPDATE OF 'VALVA'
2 1 TABLE ACCESS (FULL) OF 'VALVA'
Statistics
----------------------------------------------------------
0 recursive calls
2 db block gets
5064 consistent gets
5055 physical reads
388 redo size
868 bytes sent via SQL*Net to client
735 bytes received via SQL*Net from client
3 SQL*Net roundtrips to/from client
1 sorts (memory)
0 sorts (disk)
1 rows processed
-
-
Tu as des UPPER sur tes colonnes dans la partie gauche de tes clauses WHERE...
A moins que tu ais créé des Index de fonction cela invalide tes INDEX...
même si tu spécifie que tu les utilise (via le HINT) ils ne te servent à rien...
Enlève les UPPER ou créee des INDEX sur la valeur UPPERisée de tes colonnes.