Einzelnen Beitrag anzeigen

moelski

Registriert seit: 31. Jul 2004
1.110 Beiträge
 
Delphi 2010 Professional
 
#6

Re: Schnellste Insert Möglichkeit für eine DB?

  Alt 2. Mär 2010, 14:28
Moin !

Ich habe mal alle 3 Varianten umgesetzt. (Code siehe unten).

Count : 1000
1 Time : 10390 ms
2 Time : 8016 ms
3 Time : 14952 ms

Count : 100
1 Time : 1062 ms
2 Time : 985 ms
3 Time : 2296 ms

Die Ergebnisse zeigen das es derzeit so ausschaut als wenn die reine Insert Methode die schnellste wäre.
Danach kommt die FieldByName Variante. Und am Ende steht die Parameter Variante von Sharky (was mich sehr erstaunt).

Count bezieht sich auf die anzahl der Datensätze die eingetragen werden.

Hier noch der verwendete Code:
Delphi-Quellcode:
procedure TDBThread.Execute;
var I : Integer;
    StartTime : TDateTime;
    SQl : String;
begin
  StartTime := Now;
  DBQuery.Edit;
  for I := 1 to Amount do begin
    Inc(Counter);
    DBQuery.FieldByName('ID').AsInteger := Counter;
    DBQuery.FieldByName('PROP01').AsFloat := Random(10000);
    DBQuery.FieldByName('PROP02').AsFloat := Random(10000);
    DBQuery.FieldByName('PROP03').AsFloat := Random(10000);
    DBQuery.FieldByName('PROP04').AsFloat := Random(10000);
    DBQuery.FieldByName('PROP05').AsFloat := Random(10000);
    DBQuery.FieldByName('PROP06').AsFloat := Random(10000);
    DBQuery.FieldByName('PROP07').AsFloat := Random(10000);
    DBQuery.FieldByName('PROP08').AsFloat := Random(10000);
    DBQuery.FieldByName('PROP09').AsFloat := Random(10000);
    DBQuery.FieldByName('PROP10').AsFloat := Random(10000);
    DBQuery.FieldByName('DateTime').AsSQLTimeStamp := DateTimeToSQLTimeStamp(Now);

    DBQuery.Append;
  end;
  TimeMS := MilliSecondsBetween(Now, StartTime);
  Form2.Memo1.Lines.Add('1 Time : ' + IntToStr(TimeMS) + ' ms');

  StartTime := Now;
  for I := 1 to Amount do begin
    Inc(Counter);
    SQl := 'INSERT Into ' + Table;
    SQl := SQl + ' (ID, PROP01, PROP02, PROP03, PROP04, PROP05, PROP06, PROP07, PROP08, PROP09, PROP10)';
    SQl := SQl + ' VALUES (' + IntToStr(Counter) + ', ';
    SQl := SQl + FloatToStr(Random(10000) ) + ', ';
    SQl := SQl + FloatToStr(Random(10000) ) + ', ';
    SQl := SQl + FloatToStr(Random(10000) ) + ', ';
    SQl := SQl + FloatToStr(Random(10000) ) + ', ';
    SQl := SQl + FloatToStr(Random(10000) ) + ', ';
    SQl := SQl + FloatToStr(Random(10000) ) + ', ';
    SQl := SQl + FloatToStr(Random(10000) ) + ', ';
    SQl := SQl + FloatToStr(Random(10000) ) + ', ';
    SQl := SQl + FloatToStr(Random(10000) ) + ', ';
    SQl := SQl + FloatToStr(Random(10000) ) + ');';
    //SQl := SQl + SQLTimeStampToStr('ddd d of mmm yyyy', DateTimeToSQLTimeStamp(Now)) + ');';
    DBQuery.SQL.Text := SQL;
    DBQuery.ExecSQL;
  end;
  TimeMS := MilliSecondsBetween(Now, StartTime);
  Form2.Memo1.Lines.Add('2 Time : ' + IntToStr(TimeMS) + ' ms');

  StartTime := Now;
  for I := 1 to Amount do begin
    Inc(Counter);
    DBQuery.SQL.Text := 'INSERT Into ' + Table + ' (ID, PROP01, PROP02, PROP03, PROP04, PROP05, PROP06, PROP07, PROP08, PROP09, PROP10) VALUES (:wert1, :wert2, :wert3, :wert4, :wert5, :wert6, :wert7, :wert8, :wert9, :wert10, :wert11);';
    DBQuery.Prepare;
    DBQuery.Params[0].AsInteger := Counter;
    DBQuery.Params[1].AsFloat := Random(10000);
    DBQuery.Params[2].AsFloat := Random(10000);
    DBQuery.Params[3].AsFloat := Random(10000);
    DBQuery.Params[4].AsFloat := Random(10000);
    DBQuery.Params[5].AsFloat := Random(10000);
    DBQuery.Params[6].AsFloat := Random(10000);
    DBQuery.Params[7].AsFloat := Random(10000);
    DBQuery.Params[8].AsFloat := Random(10000);
    DBQuery.Params[9].AsFloat := Random(10000);
    DBQuery.Params[10].AsFloat := Random(10000);
    DBQuery.ExecSQL;
  end;

  TimeMS := MilliSecondsBetween(Now, StartTime);
  Form2.Memo1.Lines.Add('3 Time : ' + IntToStr(TimeMS) + ' ms')
end;
Dominik Schmidt
Greetz Dominik

I love Delphi 2007/2010
  Mit Zitat antworten Zitat