Précédent   Forum des professionnels en informatique > Bases de données > Oracle > SQL
SQL Forum d'entraide sur le SQL pour Oracle
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 23/12/2010, 10h08   #1
Nouveau Membre du Club
 
Matthieu Maquevice
Inscription : février 2008
Messages : 106
Détails du profil
Informations personnelles :
Nom : Matthieu Maquevice
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : février 2008
Messages : 106
Points : 37
Points : 37
Par défaut update sur plusieurs lignes avec table temporaire

Bonjour,

J'ai créé une table temporaire "TEMP" dans laquelle je stock l'identifiant et la date d'un contrat.

J'ai une table "CONTRAT" et pour chaque tuple présent dans la table temporaire j'aimerais mettre à jour la colonne "C_DATE" de ma table "CONTRAT".

Pour l'instant je réalise ceci avec la requête :
Code :
1
2
UPDATE CONTRAT c SET c.C_DATE=(SELECT t1.t_date FROM TEMP t1 WHERE t1.id=c.C_ID)  
WHERE c.C_ID=(SELECT t2.id FROM TEMP t2 WHERE t2.id=c.C_ID);
Ma table "TEMP" fait 280000 tuples, il y a donc autant d'update à réaliser, cependant il prend un temps de fou pour faire l'update, y a-t-il une méthode plus rapide ?

Merci !
-=mateo=- est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/12/2010, 11h10   #2
McM
Expert Confirmé Sénior
 
Inscription : juillet 2003
Messages : 3 437
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 3 437
Points : 4 173
Points : 4 173
As tu créé un index sur TEMP.id ?

Code :
1
2
3
UPDATE CONTRAT c 
SET c.C_DATE=(SELECT t1.t_date FROM TEMP t1 WHERE t1.id=c.C_ID)  
WHERE EXISTS (SELECT 1 FROM TEMP t2 WHERE t2.id=c.C_ID);
ou
Code :
1
2
3
UPDATE CONTRAT c 
SET c.C_DATE=(SELECT t1.t_date FROM TEMP t1 WHERE t1.id=c.C_ID)  
WHERE C_ID IN (SELECT id FROM TEMP);
A vérifier au niveau Explain Plan.
__________________
More Code : More Bugs. Less Code : Less Bugs
McM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/12/2010, 11h13   #3
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 684
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 684
Points : 10 463
Points : 10 463
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
Avez-vous un index sur la colonne C_ID ?

On écrit les updates avec un ordre d'existence dans le where plutôt qu'une liste :
Code :
1
2
3
4
5
6
7
UPDATE CONTRAT c
   SET c.C_DATE = (SELECT t1.t_date
                     FROM TEMP t1
                    WHERE t1.id = c.C_ID)  
 WHERE EXISTS (SELECT NULL
                 FROM TEMP t2
                WHERE t2.id = c.C_ID);
Si vous êtes au moins en 10g vous pouvez faire un merge avec juste un update :
Code :
1
2
3
4
5
 merge INTO CONTRAT c
 USING TEMP t
    ON (t.id = c.c_id)
  when matched then
UPDATE SET c.C_DATE = t.t_date;
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/12/2010, 14h40   #4
Nouveau Membre du Club
 
Matthieu Maquevice
Inscription : février 2008
Messages : 106
Détails du profil
Informations personnelles :
Nom : Matthieu Maquevice
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : février 2008
Messages : 106
Points : 37
Points : 37
Merci pour vos réponses.

Walder, ton merge convient tout à fait à ce que je voulais faire. Je suis passé de 6h d'exécution à 15 secondes, merci beaucoup!

Petit question : pourquoi la clause d'existence (where exists) est mieux que la liste ?

Merci!
-=mateo=- est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 08h22.


 
 
 
 
Partenaires

Hébergement Web