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;