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 :

Procédure longue (delete, insert)


Sujet :

PL/SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de jlm22
    Homme Profil pro
    Etudiant
    Inscrit en
    Décembre 2010
    Messages
    203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Décembre 2010
    Messages : 203
    Par défaut Procédure longue (delete, insert)
    Bonjour,

    j'ai fait une procédure qui met à jour manullement un table par rapport à une autre c'est à dire que j'effece les données d'une table pour les 15 derniers jours et je récupère les données des 15 derniers jours d'une autre table pour les remettre dedans.
    Je lance cette procédure 1 fois par semaine grâce à un jobs. J'en suis encore au phase de test mais je trouve le tratement très long.

    Par exemple pour 500 000 ligne le delete prend + de 10 min et l'insert 8min (la procédure entière pour une seul table prend 20 min), sachant que je met à jour dans la même procédure une soixantaine de table de même taille

    Y'a t_il un moyen d'améliorer mon traitement si oui de quel coté je doit regarder (Insert, delete) ?

    Voici le script :

    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
    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
     
    create or replace PROCEDURE PROC_BDEHISTO AS
     
    v_Periodicite   number;
    v_table		  	varchar2(50);
    v_requete		varchar2(2000);
    v_verif_purge   varchar2(100);
    v_cpt number ;
     
    cursor C1 is
    	   select Ltable,periodicite,ldate, ldate2
    	   from histo;
     
    C1r	   C1%ROWTYPE;
     
    BEGIN
     
    OPEN C1;
        FETCH C1 INTO C1r;
        -- on parcours la table Histo
        while C1%FOUND loop
     
          v_requete:='SELECT COUNT(*) FROM '||C1r.Ltable||'@bdepkg0';
          EXECUTE IMMEDIATE v_requete into v_cpt;
          DBMS_OUTPUT.PUT_LINE( To_char( v_cpt ) || ' enregistrements') ;
          DBMS_OUTPUT.PUT_LINE(C1r.Ltable);
     
        -- si =0 alors il vient d'avoir une purge donc on ne met rien a jour
    		if v_cpt>0 then
    			if C1r.ldate is null then
     
              -- on supprime les anciennes saisies
              v_requete := 'delete from '|| C1r.Ltable ||' where to_date('|| C1r.ldate ||',''YYYY/MM/DD'') < TO_DATE(TO_CHAR(SYSDATE,''YYYY/MM/DD''),''YYYY/MM/DD'')'; -- And to_date('|| C1r.ldate ||',''YYYY/MM/DD'') > TO_DATE(TO_CHAR((sysdate - ' || C1r.periodicite ||'),''YYYY/MM/DD''),''YYYY/MM/DD'') ';
              EXECUTE IMMEDIATE v_requete;
              commit;
     
              -- on met à jour BDE Histo
              v_requete := 'insert into '|| C1r.Ltable ||' select * from '|| C1r.Ltable ||'@bdepkg0 where to_date('|| C1r.ldate ||',''YYYY/MM/DD'') < TO_DATE(TO_CHAR(SYSDATE,''YYYY/MM/DD''),''YYYY/MM/DD'')'; -- And to_date(DCarton,''YYYY/MM/DD'') > TO_DATE(to_char((sysdate - '|| C1r.periodicite ||'),''YYYY/MM/DD''),''YYYY/MM/DD'')';
              EXECUTE IMMEDIATE v_requete;
              commit;
     
          elsif c1r.ldate2 is null then
     
              -- on supprime les anciennes saisies
              v_requete := 'delete from '|| C1r.Ltable ||' where to_date('|| C1r.ldate ||',''DD/MM/YY'') < TO_DATE(TO_CHAR(SYSDATE,''DD/MM/YY''),''DD/MM/YY'')'; -- And to_date('|| C1r.ldate ||',''YYYY/MM/DD'') > TO_DATE(TO_CHAR((sysdate - ' || C1r.periodicite ||'),''YYYY/MM/DD''),''YYYY/MM/DD'') ';
              EXECUTE IMMEDIATE v_requete;
              commit;
     
              -- on met à jour BDE Histo
              v_requete := 'insert into '|| C1r.Ltable ||' select * from '|| C1r.Ltable ||'@bdepkg0 where to_date('|| C1r.ldate ||',''DD/MM/YY'') < TO_DATE(TO_CHAR(SYSDATE,''DD/MM/YY''),''DD/MM/YY'')'; -- And to_date(DCarton,''YYYY/MM/DD'') > TO_DATE(to_char((sysdate - '|| C1r.periodicite ||'),''YYYY/MM/DD''),''YYYY/MM/DD'')';
              EXECUTE IMMEDIATE v_requete;
              commit;
              dbms_output.put_line(v_requete);
     
          end if;
    		end if;
        FETCH C1 into C1r;
        end loop;
    CLOSE C1;
    END;

  2. #2
    Membre confirmé Avatar de jlm22
    Homme Profil pro
    Etudiant
    Inscrit en
    Décembre 2010
    Messages
    203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Décembre 2010
    Messages : 203
    Par défaut
    Bon j'ai mis des indexes sur les dates (je viens seulement d'y pensé) et c'est furieusement efficace, la procédure s'execute en 20 min sur ma plus grosse table (2 000 000 de ligne).

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

Discussions similaires

  1. Procédure stocké et insertion de données
    Par yancimer dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 29/08/2006, 17h33
  2. [SQL] delete+insert ou plusieurs update c'est quoi le mieux?
    Par cassy dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 21/06/2006, 10h47
  3. voir les tables virtuel deleted inserted
    Par berceker united dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 19/06/2006, 14h31
  4. performance delete/insert vs update
    Par Dionisos dans le forum Langage SQL
    Réponses: 6
    Dernier message: 01/08/2005, 18h23
  5. Réponses: 10
    Dernier message: 22/11/2004, 22h37

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