繁体   English   中英

将记录从一个数据库迁移到 mysql 使用 Delphi 和 Firedac 非常慢

[英]Migrating records from one db to mysql it is very slow with Delphi and Firedac

我必须将超过 100000 条记录从 Advantage Database Local 迁移到 Mysql ( local )。

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

我需要一些帮助来提高速度,也许是修改代码或一些 firedac 属性。

代码很简单。 我从 Advantable 表中请求所有记录,并对每条记录进行循环并插入到 mysql 本地数据库中。

    // 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;

我正在修改代码以使用参数,但仍然无法对其进行测试。

我还可以更改什么以使此代码更快?

非常感谢。

最好的问候。

解决类似问题的示例。

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) );

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM