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:
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. |