Мой запрос при запуске занимает около 7 секунд, чтобы сделать то, что предполагается. Но, поскольку он вставляет около 30 записей, я думаю, что это слишком медленно. Теперь я либо запускаю запрос, который не написано хорошо, или на самом деле это занимает много времени. Но это было бы странно. Основная база данных SQLite и запрос выглядит следующим образом:Delphi - запрос медленный
procedure TForm1.cxButton1Click(Sender: TObject);
begin
with UNIquery2 do begin
Close;
SQL.Clear;
UNIQuery1.First;
while Uniquery1.EOF = false do begin
SQL.Text:= 'INSERT INTO MYTABLE (FIELD1,FIELD2,FIELD3,FIELD4) VALUES (:a1,:a2,:a3,:a4)';
ParamByName('a1').asString := AdvOfficeStatusBar1.Panels[0].Text;
ParamByName('a2').asString := UniTable1.FieldByName('FIELD2').asString;
ParamByName('a3').asString := Uniquery1.FieldByName(',FIELD3').asString;
ParamByName('a4').Value := Uniquery1.FieldByName('FIELD4').Value;//boolean field true/false
Uniquery1.Next;
ExecSQL;
end;
end;
end;
Так может кто-нибудь сказать мне, если это нормально или я что-то отсутствует? Все поля - это текст, кроме «a4», который является логическим (true/false).
Ответ, модифицированный (на основе suuggestion из LS_dev):
procedure TForm1.cxButton1Click(Sender: TObject);
begin
with UNIquery2 do begin
Close;
SQL.Clear;
SQL.Add('INSERT INTO MYTABLE (FIELD1,FIELD2,FIELD3,FIELD4) VALUES (:a1,:a2,:a3,:a4)');
SQL.Prepare;
UniTransaction.AddConnection(UniConnection2);
UniTransaction.StartTransaction;
try
UNIQuery1.First;
while Uniquery1.EOF = false do begin
Params[0].asString := AdvOfficeStatusBar1.Panels[0].Text;
Params[1].asString := UniTable1.FieldByName('FIELD2').asString;
Params[2].asString := Uniquery1.FieldByName(',FIELD3').asString;
Params[3].Value := Uniquery1.FieldByName('FIELD4').Value;//boolean field true/false
Uniquery1.Next;
ExecSQL;
end;
UniTransaction.Commit;
finally
if UNIquery2.Connection.InTransaction then
UNIquery2.Connection.Rollback;
end;
end;
end;
Вы должны назначить оператор SQL для UniQuery2 один раз вне цикла UniQuery1. Также определите параметры (ptInput и ftString/ftString), а затем, возможно, подготовьте запрос (dunno, если UniQuery имеет это). Затем в вашем цикле вам нужно только установить значения параметров. –
Также, задавая вопросы с кодом, вы должны указывать определения переменных. Что это за тип UniQuery? Измените свой вопрос. –
В качестве первого шага остановите использование цикла XXXByName в цикле, вместо этого используйте индексы. –