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

PL/SQL Oracle Discussion :

Update en masse d'une table


Sujet :

PL/SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Inscrit en
    Juin 2010
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 4
    Par défaut Update en masse d'une table
    Bonjour,


    J'ai créé une procédure stockée dans laquelle je fais des mise à jour d'une table "table_calcul" (ligne par ligne), et j'aimerais savoir comment faire une mise à jour en masse de cette table.
    La table table_calcul question contient 20 millions de lignes et la mise à jour dure en moyenne 3h.

    Ci dessous ma procédure :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
     
    PROCEDURE calcul_test (p_ind     IN VARCHAR2,
                           p_montant IN NUMBER,
                           P_appel    IN OUT aaaa) AS
     
    v_deb   DATE;
    v_fin   DATE; 
    v_der   DATE;
     
    BEGIN
     
       IF (p_ind = aaa) THEN
            v_der := bbbb;
       END IF;
     
       v_deb := P_appel.jou + 1;     
     
     
       WHILE (v_deb <= v_der)
       LOOP
             IF (v_deb = v_der) THEN
                P_appel.aa := P_appel.bbb + ccct;
             END IF;
     
    	     UPDATE table_calcul
    	      SET colone1 = P_appel.mnt1,
    	          colonne2 = P_appel.mnt2,
    	           coluonne 3 = dat_der
    	      WHERE colonne 4 = v_deb;
     
     end loop ;
     
    end calcul_test;
    /
    J'ai pensé à la fonctionnalité bulk collect ? mais, je ne sais pa si c'est la bonne solution, ni comment procéder

    Merci par avance pour vos réponses.

  2. #2
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Par défaut
    Essayez de faire un update de la table à la place de l’update ligne-à-ligne. Si cette solution ne vous convient pas il y a des autres techniques qui peuvent être employées: create table bis as select avec update suivi de drop table, fonctions pipelined en parallèle, etc. Faite aussi une recherche sur ce forum.

  3. #3
    Futur Membre du Club
    Inscrit en
    Juin 2010
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 4
    Par défaut
    J'ai pense à utiliser bulk collect en créant un curseur avec deux paramétres (v_deb,dat_der).
    Qu'est ce que t'en pense ?

  4. #4
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Par défaut
    Citation Envoyé par ousmaa2108 Voir le message
    J'ai pense à utiliser bulk collect en créant un curseur avec deux paramétres (v_deb,dat_der).
    Qu'est ce que t'en pense ?
    Il est certes qu'en utilisant BULK ça va aller plus vite que l'update ligne à ligne. Mais, moins vite qu'un update tout court. Peut être vous devez considérer aussi la mise à jour en parallèle.

  5. #5
    Futur Membre du Club
    Inscrit en
    Juin 2010
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 4
    Par défaut
    pardon un curseur avec deux paramétres ( v_deb,v_der)

  6. #6
    Futur Membre du Club
    Inscrit en
    Juin 2010
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 4
    Par défaut
    Pouvez m'en dire plus sur cette méthode svp :

    create table bis as select avec update suivi de drop table, fonctions pipelined en parallèle

    Concrétement, qu'est ce que je dois faire ?

    Merci

  7. #7
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Par défaut
    Pour le "create table bis as select avec update suivi de drop table" lisez cette discution sur AskTom
    Concernant l'utilisation des fonctions pipelined lisez cette article "improving performance with pipelined table functions"
    Mais, si dans le cadre de votre procédure vous pouvez faire la mise à jour avec un simple update des 20M lignes à modifier et le temps de réponse est satisfaisante c'est une très bon solution.

Discussions similaires

  1. Réponses: 2
    Dernier message: 22/09/2008, 18h21
  2. Update et insert dans une table de backup
    Par PunkMetal dans le forum Langage SQL
    Réponses: 4
    Dernier message: 27/08/2008, 05h41
  3. [ASE12.5]Insertion en masse dans une table
    Par jfmerveille dans le forum Adaptive Server Enterprise
    Réponses: 6
    Dernier message: 03/12/2007, 15h14
  4. Insertion en masse dans une table
    Par scheu dans le forum Administration
    Réponses: 5
    Dernier message: 04/10/2007, 17h33
  5. UPDATER le champ d'une table 1 avec le champ d'une table 2
    Par alain.dissoir dans le forum Oracle
    Réponses: 2
    Dernier message: 08/06/2005, 13h07

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