Bonjour,

Je me permets de vous demander de l'aide pour optimiser une réplication de datas. Je ne suis pas un As en SQL et je pense que beaucoup de chose vont vous choquer (index, format de la base...), alors n'hésiter pas !

Posons le contexte :

Je fais un export de données d'une base Informix, j'obtiens donc de nombreux fichiers ctl variant de 5Ko à 32Mo.
Ces fichiers sont stockés dans un répertoire partagé.

Un cron (je suis sur Aix 5.3) s'occupe ensuite d'importer ses données dans un infocentre, bdd Oracle 8i. J'ai modifié il y a peu de temps la taille des blocs (de 4ko à 16ko).

Mais c'est là que le bas blesse, l'import est très très long (>72 heures ).

Je ne peux pas vous énoncer les trop nombreuses étapes d'import mais je pense qu'il serait intéressant que je vous expose les principales requêtes qui posent problèmes...

On charge dans une table Result_Trait (aucun index) de très nombreux résultats qui sont ensuite triés dans d'autres tables suivant leur paramètres.
On utilise donc des curseurs, des loops, des access full...

Par exemple on insert une partie des résultats dans une autre table Result_Man par le sql suivant :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
declare
        cursor c1 is select * from result_trait where celem = 'GER' order by nodem, noordre;
begin
        for c1_enreg in c1 loop
        insert into result_man values 
        (c1_enreg.nodem,c1_enreg.noordre,c1_enreg.celem,c1_enreg.cexam,c1_enreg.result,0);  
        end loop;
commit;
end;
/
exit;
Ou encore ce genre de chose dans une autre table Result_Cmi
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
declare
        cursor c1 is select a.nodem, a.noordre, b.result, b.celem from result_cmi a, result_trait b
                     where a.nodem = b.nodem and a.noordre = b.noordre
                     and b.celem like 'C%' order by a.nodem, a.noordre;
begin
        for c1_enreg in c1 loop
                 update result_int set cmi = c1_enreg.celem,
                                valeur_cmi = c1_enreg.result
                 where nodem = c1_enreg.nodem
                 and   num_ordre = (c1_enreg.noordre-1);
 commit;
        end loop;
commit;
end;
/
exit;
Et ces traitements sont affreusement longs...
Auriez vous des pistes à me proposer ? Y'a t'il du code choquants pour les expert du forum ?


Merci d'avance pour votre aide.

William