Précédent   Forum des professionnels en informatique > Bases de données > Oracle > PL/SQL
PL/SQL Forum d'entraide sur le PL/SQL
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 18/05/2011, 10h22   #1
Membre habitué
 
Avatar de jlm22
 
Homme Jean-Louis
Etudiant
Inscription : décembre 2010
Messages : 199
Détails du profil
Informations personnelles :
Nom : Homme Jean-Louis
Âge : 20
Localisation : France

Informations professionnelles :
Activité : Etudiant

Informations forums :
Inscription : décembre 2010
Messages : 199
Points : 114
Points : 114
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 :
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;
jlm22 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/05/2011, 14h46   #2
Membre habitué
 
Avatar de jlm22
 
Homme Jean-Louis
Etudiant
Inscription : décembre 2010
Messages : 199
Détails du profil
Informations personnelles :
Nom : Homme Jean-Louis
Âge : 20
Localisation : France

Informations professionnelles :
Activité : Etudiant

Informations forums :
Inscription : décembre 2010
Messages : 199
Points : 114
Points : 114
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).
jlm22 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 14h29.


 
 
 
 
Partenaires

Hébergement Web