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;