将记录从一个db迁移到mysql,Delphi和Firedac的速度非常慢

时间:2017-10-11 19:53:21

标签: mysql delphi firedac advantage-database-server

我必须将多个记录超过100000从Advantage Database Local迁移到Mysql(本地)。

我正在使用此代码进行测试,但其结果非常慢。超过2个小时 迁移120000条记录。

我需要一些帮助才能提高速度,可能会修改代码或某些炒作属性。

代码非常简单。我请求Advantable表中的所有记录,并为每个记录执行循环并插入到mysql本地db。

    // ADVANTAGE TABLE
    DM.Qry_Usb.SQL.Clear;
    DM.Qry_USB.SQL.Add( 'Select * from Cabezal' );
    DM.Qry_USB.SQL.Add( 'order by Fecha, Pedido' );
    DM.Qry_USB.Open;

    while not DM.Qry_USB.Eof do
    begin

        DM.FDQuery.SQL.Clear;    // MYSQL DB
        DM.FDQuery.SQL.Add( 'Insert Into Cabezal ' );
        DM.FDQuery.SQL.Add( '( Correla, Fecha, Hora, Cliente, Pedido, Direccion, ');
        DM.FDQuery.SQL.Add( 'Entre, yEntre, Estado, Total, PedidoxWeb ) ' );
        DM.FDQuery.SQL.Add( 'Values ( ' );
        DM.FDQuery.SQL.Add( IntToStr( DM.Qry_USB.FieldByName('Correla').AsInteger ) + ',' );
        DM.FDQuery.SQL.Add( QuotedStr( FormatDateTime( 'DD.MM.YYYY', DM.Qry_Usb.FieldByName('Fecha').AsDateTime ) ) + ',' );
        DM.FDQuery.SQL.Add( QuotedStr( FormatDateTime( 'HH:MM:SS', DM.Qry_Usb.FieldByName('Hora').AsDateTime ) ) + ',' );
        DM.FDQuery.SQL.Add( IntToStr( DM.Qry_USB.FieldByName('Cliente').AsInteger ) + ',' );
        DM.FDQuery.SQL.Add( IntToStr( DM.Qry_USB.FieldByName('Pedido').AsInteger ) + ',' );
        DM.FDQuery.SQL.Add( QuotedStr( DM.Qry_USB.FieldByName('Direccion').AsString ) + ',' );
        DM.FDQuery.SQL.Add( QuotedStr( DM.Qry_USB.FieldByName('Entre').AsString ) + ',' );
        DM.FDQuery.SQL.Add( QuotedStr( DM.Qry_USB.FieldByName('YEntre').AsString ) + ')' );
        DM.FDQuery.ExecSQL;

        DM.Qry_USB.Next;

    end;
    DM.FDConnection.Commit;

我正在修改代码以使用参数但仍无法测试它。

我还可以改变什么来使这段代码更快?

提前多多感谢。

最好的注册。

1 个答案:

答案 0 :(得分:0)

解决类似问题的示例。

http://docwiki.embarcadero.com/CodeExamples/Sydney/en/FireDAC.TFDQuery.Batch_Sample

  FDQuery1.SQL.add('sELECT * from cars');
  FDQuery1.open;


  FmMain.FDConnection1.StartTransaction;
  FDQuery2.sql.clear;
  FDQuery2.sql.add('INSERT INTO tributosasociados (id,NroContrib, CodTributo, CodImponible,descripcion,BAseImponible,Alicuota,FechaAlta,activo )');
  FDQuery2.sql.Add('VALUES(null, :NroContrib,:CodTributo,:CodImponible, :descripcion, :BAseImponible,:Alicuota,:FechaAlta,:activo)');


  FDQuery2.Params.ArraySize := FDQuery1.RecordCount;
   i := 0;
  while not FDQuery1.eof do
   begin
     FDQuery2.ParamByName('CodTributo').AsIntegers[i] := 3;
     FDQuery2.ParamByName('NroContrib').AsIntegers[i] := FDQuery1.FieldByName('NroContrib').AsInteger;
     FDQuery2.ParamByName('CodImponible').AsStrings[i] := FDQuery1.FieldByName('dominio').AsString;
     FDQuery2.ParamByName('descripcion').AsStrings[i] := FDQuery1.FieldByName('descripcion').AsString +' / '+ FDQuery1.FieldByName('anio').AsString;
     FDQuery2.ParamByName('BAseImponible').AsFloats[i] := FDQuery1.FieldByName('valuacion').AsFloat;
     FDQuery2.ParamByName('Alicuota').AsFloats[i] := 1.7; // FDQuery1.FieldByName('****Ver Alicuta BUTA****').AsFloat;
     FDQuery2.ParamByName('FechaAlta').AsdateTimes[i] := FDQuery1.FieldByName('FechaAlta').AsdateTime;
     FDQuery2.ParamByName('activo').AsIntegers[i] := 1;

     FDQuery1.next;
     i := i+1;
   end;

  FDQuery2.Execute(FDQuery2.Params.ArraySize);

  FmMain.FDConnection1.Commit;

 FDQuery1.close;
 FDQuery2.close;
 ShowMessage( intToStr(i) );