IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SQL Oracle Discussion :

update sur plusieurs lignes avec table temporaire


Sujet :

SQL Oracle

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Février 2008
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2008
    Messages : 106
    Points : 70
    Points
    70
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 !

  2. #2
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    As tu créé un index sur TEMP.id ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  3. #3
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 386
    Points
    18 386
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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;

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Février 2008
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2008
    Messages : 106
    Points : 70
    Points
    70
    Par défaut
    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!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. UPDATE sur plusieurs lignes ?
    Par tintin72 dans le forum Requêtes
    Réponses: 9
    Dernier message: 02/01/2013, 17h28
  2. [AC-2003] update sur plusieurs champs avec 2 tables
    Par C02226 dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 24/10/2012, 22h16
  3. [SQL] update sur plusieurs lignes
    Par Hurin dans le forum Langage SQL
    Réponses: 8
    Dernier message: 04/08/2008, 16h37
  4. Update sur plusieurs lignes
    Par JOUCHET dans le forum Oracle
    Réponses: 1
    Dernier message: 20/05/2006, 18h37
  5. Bouton radio sur plusieur ligne avec Border layout
    Par Bason_sensei dans le forum AWT/Swing
    Réponses: 6
    Dernier message: 03/05/2006, 16h03

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo