Optimisation de la requête update sous Oracle

Signaler
Messages postés
2
Date d'inscription
mercredi 25 mars 2009
Statut
Membre
Dernière intervention
2 février 2011
-
EricSQL
Messages postés
33
Date d'inscription
samedi 11 octobre 2008
Statut
Membre
Dernière intervention
24 février 2011
-
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

Messages postés
6063
Date d'inscription
dimanche 13 avril 2003
Statut
Modérateur
Dernière intervention
15 juillet 2011
25
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
Messages postés
2
Date d'inscription
mercredi 25 mars 2009
Statut
Membre
Dernière intervention
2 février 2011

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
Messages postés
6063
Date d'inscription
dimanche 13 avril 2003
Statut
Modérateur
Dernière intervention
15 juillet 2011
25
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

Messages postés
33
Date d'inscription
samedi 11 octobre 2008
Statut
Membre
Dernière intervention
24 février 2011

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