Optimisation de la requête update sous Oracle

YOUEL24 Messages postés 2 Date d'inscription mercredi 25 mars 2009 Statut Membre Dernière intervention 2 février 2011 - 1 févr. 2011 à 15:36
EricSQL Messages postés 33 Date d'inscription samedi 11 octobre 2008 Statut Membre Dernière intervention 24 février 2011 - 24 févr. 2011 à 19:17
Bonjour,

L'exécution de la requête ci-dessous sous oracle, me prends plus de 3h, pourriez-vous svp m'aider à l'optimiser?

D'avance, je vous remercie.

Celine.

**************************************************************
update table1 A
set A.CHAMPSa2='YES'
WHERE A.champsA1=
(select distinct A.champsA1
from table2 B,table3 C
where A.cle1=B.cle1 and A.cle2=C.cle2 and A.champsA1 in ('11111','2222','3333')
and B.champsB1 not in('AAAAA') and C.champsC1 ='ATN' and A.ENV='DEV') ;
***************************************************************
A voir également:

4 réponses

nhervagault Messages postés 6063 Date d'inscription dimanche 13 avril 2003 Statut Membre Dernière intervention 15 juillet 2011 37
1 févr. 2011 à 16:37
Salut,

Voici des pistes dans le désordre. (merci d'indiquer tes resultats apres)

As-tu mis des index sur les colonnes?

Utilises des inner join sur les colonnes de references?

Utilises une vue pour la requete de sélection?

Changes le not in ('AAAA') en != de 'AAAA' ou not (je ne connais pas trop Oracle)(l'operateur est moins gourmand)

Evites l'utilisation de distinct prend plutot un top 1.
Surtout que distinct peut renvoyer n enregistrements.


Bon dev
1
YOUEL24 Messages postés 2 Date d'inscription mercredi 25 mars 2009 Statut Membre Dernière intervention 2 février 2011
2 févr. 2011 à 10:46
Bonjour,

Merci pour votre aide.
Quelle est la commande pour prendre le top 1? est-ce que je peux utiliser MAX(ChampsA1) à la place de distinct?

Merci
0
nhervagault Messages postés 6063 Date d'inscription dimanche 13 avril 2003 Statut Membre Dernière intervention 15 juillet 2011 37
2 févr. 2011 à 10:53
Salut

http://www.orafaq.com/faq/how_does_one_select_the_top_n_rows_from_a_table

Je ne savait pas que top n'etait pas defini dans oracle

encore mieux peut etre
SELECT column FROM table
WHERE ROWNUM = 1

0
EricSQL Messages postés 33 Date d'inscription samedi 11 octobre 2008 Statut Membre Dernière intervention 24 février 2011
24 févr. 2011 à 19:17
Bonjour,

avant toutes choses, il faudrait connaitre quels sont les index sur les 3 tables, et les volumétries en jeu.
Sans connaitre ces informations, la requête devrait être plus rapide ainsi :
Update TABLE1 A
  set A.champsa2 = 'YES'
  where exists (
                 Select 1
                   from TABLE2 B
                      , TABLE3 C
                   where A.cle1     =  B.cle1
                     and A.cle2     =  C.cle2
                     and B.champsB1 <> 'AAAAA'
                     and C.champsC1 =  'ATN'
               )
    and A.champsA1 in ('11111','2222','3333')
    and A.ENV      =  'DEV'
    and A.champsa2 <> 'YES'
;



/Eric
0
Rejoignez-nous