title: Delphi - Query running slow
body: <p>My query,when run takes about 7 seconds to do what is supposed to.But,since its inserting about 30 records,I think it is too slow.Now,either I am running the query that is not written well or it does actually takes this much time. But that would be strange. The underlying database is SQLite and the query looks like this :</p>
  
  <pre><code>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;
  </code></pre>
  
  <p>So can someone tell me if this is OK or am I missing something ?
  All fields are text except the 'a4' which is boolean (true/false).</p>
  
  <p>The answer,modified (based on suuggestion from LS_dev):</p>
  
  <pre><code>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;
  </code></pre>