Einzelnen Beitrag anzeigen

Benutzerbild von mika
mika

Registriert seit: 25. Okt 2002
176 Beiträge
 
Delphi 6 Professional
 
#5

AW: Select Optimierung bei Tabelle mit 15.Mio Datensätzen

  Alt 15. Sep 2011, 11:16
Hallo und danke schonmal für die Antworten!

Zu dem Index: Wie oben geschrieben, es existieren bereits Indizes für jede einzelne Spalte und ein Index für Datum; Uhrzeit (also auch die richtige Reihenfolge)

Zu dem select *: Das hab ich mir auch schon gedacht, ergab aber im SQL Query Builder keinen Unterschied in der Ausführungszeit, weswegen ich das erstmal so gelassen hab.

Zu dem nur date in der where klausel: das hab ich auch schon probiert, die ausführungszeit des sqls mit datum; uhrzeit betrug ca 6 sekunden, die nur mit datum ca 0,6 sekunden... allerdings bekomme ich dann auch ca 10000 Datensätze statt evtl nur 800. Werden die nachfolgenden Operationen dann nicht die verkürzte Ausführungszeit wieder zunichte machen?

--edit
Hier mal meine methode bis jetzt....
Code:
function TdmSchlacht.GetSchlachtDaten(FromTime, ToTime: TDateTime): Boolean;
Type
  TSchlachtdaten = packed record
    Datum: TDate;
    Transponder,
    Schlachtnummer: String;
  end;
  PSchlachtdaten = ^TSchlachtdaten;

Var

  ndx: Integer;
  Schlachtdaten: TList;
  sDaten: PSchlachtdaten;

begin
  Schlachtdaten := TList.Create;

  sqlZielLog.Close;
  sqlZielLog.SQL.Clear;

  sqlZielLog.SQL.Add('SELECT');
  sqlZielLog.SQL.Add(' *');
  sqlZielLog.SQL.Add('FROM');
  sqlZielLog.SQL.Add(' ZielLog');
  sqlZielLog.SQL.Add('WHERE');
  sqlZielLog.SQL.Add(' zl_date between '''+FormatDateTime('YYYY-MM-DD', FromTime)+''' AND '''+FormatDateTime('YYYY-MM-DD', ToTime)+'''');
  sqlZielLog.SQL.Add(' AND zl_time between '''+FormatDateTime('HH:NN:SS', FromTime)+''' AND '''+FormatDateTime('HH:NN:SS', ToTime)+'''');
  sqlZielLog.SQL.Add('ORDER BY');
  sqlZielLog.SQL.Add(' zl_date, zl_time');

  TRY
    sqlZielLog.Open;
  EXCEPT
    Result := False;
  END;

  if sqlZielLog.Active then
  begin
    ndx := 0;
    sqlZielLog.last;
    while not sqlZielLog.Eof do
    begin
      Inc(ndx);
      New(sDaten);
      sDaten.Datum := sqlZielLog.FieldByName('zl_date').AsDateTime;
      sDaten.Transponder := sqlZielLog.FieldByName('zl_transpondernr').AsString;
      sDaten.Schlachtnummer := sqlZielLog.FieldByName('zl_schlachnummer').AsString;
      Schlachtdaten.Add(sDaten);
      sqlZielLog.Next;
      if (ndx mod 50) = 0 then
        Application.ProcessMessages;
    end;
    sqlZielLog.Close;
    Result := True;
  end
  else
    Result := False;

  If Result then
  begin
    // Liste durchgehen und additionale Daten ermitteln
  end;

  for ndx := 0 to Schlachtdaten.Count - 1 do
  begin
    sDaten := Schlachtdaten[ndx];
    Dispose(sDaten);
  end;

  Schlachtdaten.Free;
end;
:: don't Panic ::

Geändert von mika (15. Sep 2011 um 11:21 Uhr)
  Mit Zitat antworten Zitat