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 :

Optimiser le temps d'une procedure


Sujet :

PL/SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2007
    Messages : 8
    Par défaut Optimiser le temps d'une procedure
    bonjour, pouvez-vous m'aider à améliorer le temps de traitement d'une procedure qui traite l'historique(comparaison de deux tables de plus 1 million d'enregistrement ).

    Code sql : 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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    SQL> desc t_paie --
     Nom                                       NULL ?   Type
     ----------------------------------------- -------- ----------------------------
     IDENT                                              VARCHAR2(12)
     CODE                                               VARCHAR2(5)
     MONTANT                                            NUMBER(10,2)
     
    SQL> desc hist_paie
     Nom                                       NULL ?   Type
     ----------------------------------------- -------- ----------------------------
     IDENT                                              VARCHAR2(12)
     CODE                                               VARCHAR2(5)
     MONTANT                                            NUMBER(10,2)
     DU                                                 DATE
     AU                                                 DATE
     
    SQL> desc t_temp
     Nom                                       NULL ?   Type
     ----------------------------------------- -------- ----------------------------
     IDENT                                              VARCHAR2(12)
     
    SQL> CREATE OR REPLACE PROCEDURE histo_paie(mois_new in date,mois_old in date) IS
      2  BEGIN
      3     DECLARE
      4        CURSOR paie_new IS
      5           SELECT ident, montant
      6           FROM t_paie
      7           WHERE code = 'N';
      8        CURSOR paie_old IS
      9           SELECT ident, montant
     10           FROM hist_paie
     11           WHERE code = 'N' AND au = mois_old;
     12  
     13     BEGIN
     14  
     15        FOR rec_new IN paie_new  LOOP
     16           FOR rec_old IN paie_old  LOOP
     17              IF rec_old.ident = rec_new.ident THEN
     18                 IF rec_old.montant <> rec_new.montant THEN
     19                    INSERT INTO t_temp
     20                    SELECT DISTINCT (ident) FROM t_paie WHERE ident = rec_new.ident;
     21                 ELSE
     22                    UPDATE hist_paie
     23                    SET au = mois_new
     24                    WHERE au = mois_old and ident =rec_old.ident;
     25                 END IF;
     26              END IF;
     27           END LOOP;
     28        END LOOP;
     29        commit;
     30        INSERT INTO hist_paie
     31        SELECT ident, code, montant, mois_new du,mois_new au
     32        FROM t_paie
     33        WHERE ident IN (SELECT ident FROM t_temp);
     34        COMMIT;
     35     END;
     36  END;
     37  /
     
    Procédure créée.
     
     
     
    SQL> begin
      2  dbms_output.enable (100000);
      3  dbms_output.put_line('DEBUT TRAITEMENT : '||to_char(sysdate,'HH24:MI:SS'));
      4  histo_paie('01/02/2010','01/01/2010');
      5  dbms_output.put_line('FIN TRAITEMENT : '||to_char(sysdate,'HH24:MI:SS'));
      6* end;
    SQL> /
    DEBUT TRAITEMENT : 13:38:09
    FIN TRAITEMENT : 16:32:57
     
    Procédure PL/SQL terminée avec succès.

  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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Drop procedure histo_paie
    /
    et utilisez Merge à sa place.

  3. #3
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2007
    Messages : 8
    Par défaut
    Citation Envoyé par mnitu Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Drop procedure histo_paie
    /
    et utilisez Merge à sa place.
    Merci,
    je vais l'examiner de plus prés et je vous répondrais.

  4. #4
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2007
    Messages : 8
    Par défaut
    Je vous signale que j'évolue en ORACLE 9i

  5. #5
    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 madmax-mad Voir le message
    Je vous signale que j'évolue en ORACLE 9i
    Merge Oracle 9i

  6. #6
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2007
    Messages : 8
    Par défaut
    Citation Envoyé par mnitu Voir le message
    trés intentionné de votre part.
    MERCI.

  7. #7
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    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 454
    Par défaut
    Expliquez ce que vous voulez faire en plus de fournir le code !

  8. #8
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2007
    Messages : 8
    Par défaut
    Citation Envoyé par Waldar Voir le message
    Expliquez ce que vous voulez faire en plus de fournir le code !
    j'utilise deux curseurs pour la comparaison des deux tables contenant:
    - les détails de la paie du mois en cours.
    - l'historique des détails de la paie.
    et comme je n'ai pas beaucoup d'espace pour inserer simplement
    la nouvelle paie dans l'historique, je doit les comparer pour n'insérer que
    les modification de paie, sinon une mise à jour sur la date de l'ancienne suffit.
    J'ai trouvé une technique de traitement en bloc dans le cours PL/SQL "BULK",
    qui est plus rapide, mais je ne sait meme pas comment la demarrer.
    donc j'implore vos grandes connaissances pour m'aider.

  9. #9
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    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 454
    Par défaut
    Je pense que mnitu vous a donné la meilleure piste.
    Pas besoin de bloc PL/SQL, un simple ordre MERGE devrait suffire.

    Essayez de l'écrire en suivant le lien fournit.

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 01/06/2006, 16h43
  2. introduire le temps dans une procedure
    Par florette dans le forum Langage
    Réponses: 4
    Dernier message: 23/04/2006, 17h05
  3. Réponses: 1
    Dernier message: 01/10/2005, 18h18
  4. Réponses: 9
    Dernier message: 20/06/2005, 12h17
  5. Réponses: 17
    Dernier message: 03/12/2004, 11h17

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