Мне нужно перенести несколько записей более 100000 из базы данных Advantage Local в Mysql (local).
Я тестирую этот код, но его результаты очень и очень медленные. Более 2 часов для переноса 120000 записей.
Мне нужна помощь, чтобы улучшить скорость, возможно, изменив код или некоторые свойства 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;
Я изменяю код для использования параметров, но все еще не могу его проверить.
Что еще я могу изменить, чтобы сделать этот код быстрее??
Заранее большое спасибо.
Лучшие регады.
TFDBatchMove
является компонентом именно для этой цели. - person Victoria   schedule 11.10.2017FieldByName
для каждой записи в Qry_USB — найдите их и назначьте их локальным переменным поля до начала цикла. И фиксируйте целевую транзакцию каждые несколько десятков строк. - person MartynA   schedule 11.10.2017TFDBatchMove
. Он будет внутренне использовать метод массива DML, который должен быть самым быстрым способом перемещения данных из одной СУБД в другую. Он достаточно гибкий, чтобы удовлетворить вашу задачу. @Ken, вставка массива DML также может значительно улучшить эту задачу (для MySQL она нативная). В данном случае это было бы изобретением велосипеда. - person Victoria   schedule 14.10.2017