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 :
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 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;
Et ces traitements sont affreusement longs...
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;
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
Partager