我必须将多个记录超过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;
我正在修改代码以使用参数但仍无法测试它。
我还可以改变什么来使这段代码更快?
提前多多感谢。
最好的注册。
答案 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) );