Tutoriel Importation et exportation massives de données sous InterBase 6.0 / FireBird 1.5.x

Bonjour,

Je souhaite réaliser des insertions massives dans une table avec FireBird 1.5 et Delphi (IBX).

Malgré les divers posts sur ce forum en rapport avec ce problème, je n'ai pas su le résoudre...

Tout d'abord j'ai réalisé ce code à titre expérimental mais un équivalent (importation de données) doit etre présent dans mon projet... Et malheureusement, pour un insert de 2000 enregistrement j'arrive à un temps de réponse entre 21 et 23 sec, et plus j'augmente le nombre d'insertion massive plus le temps augemente de manière exponentiel.

Voici un bout de mon code
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
 
try
  iChrono := GetTickCount;
 
  with IBSQL1 do begin // TIBSQL
 
    sSQL := 'INSERT INTO CLIENT (IDCLT,CIVILID,NAME,FIRSTNAME,DESCRIPT) '+
                'VALUES (null,:civ,:nom,:prenom,:desc);';
    // Ajout de l'index par trigger
    // IDCLT : BigInt; CIVILID : SmallInt; NAME,FIRSTNAME,DESCRIPT : varchar
 
    SQL.Clear;
    SQL.Add(sSQL);
 
    for iBcl := 0 to StrToInt64(EditMassNbRec.Text) do 
    // Boucle dont EditMassNbRec.text fourni le nombre d'enregistrement a faire.
    begin
      IBTrans.StartTransaction;
 
      FGerer(sNom,sPrenom,sDesc);
      // traitement des chaines sNom,sPrenom et sDesc pour champs différents pour 
      //chaque enregistrement
 
      inc(iCiv);
      if iCiv>2 then iCiv:=0;
      // changement de l'identifiant de civilité
 
      Params[0].AsInteger := iCiv;
      Params[1].AsString := sNom;
      Params[2].AsString := sPrenom;
      Params[3].AsString := sDesc;
      // affectation des paramètres de la requete
 
      Prepare;
 
      ExecQuery;
      IBTrans.Commit;
    end;
  end;
except
  if DMCltSQLDirect.IBTrans.InTransaction then DMCltSQLDirect.IBTrans.Rollback;
  ShowMessage('erreur');
end;
IBSQL1.Close;
 
LabMassInsertChrono.Caption := IntToStr(GetTickCount - iChrono)+' ms';
//indique le temps écoulé depuis le début du traitement
J'ai essayé de le documenté au mieux, mais s'il vous manque des détails n'hésitez pas à me les demander.

Que pensez-vous de ce code ? Comment l'optimiser afin d'atteindre des temps raisonnables ?
Est-ce envisageable pour une insertion de 20 000, 200 000, 2 000 000 enregistrement ?

Merci,

PS : j'ai vu l'ajout possible dans une table intermédiaire qui améliorerait nettement les temps d'exécution mais dans ce cas présent la table est vide donc ...