Hallo,
ich habe eine große Datenbank ( > 1 Mil. Datensätze ) und möchte die einzelnen Datensätze einzeln weiterverarbeiten.
Bei kleineren Datenmenge habe ich mir nie Gedanken über select & co gemacht. Bei größeren Datenmenge bekomme ich regelmäßig "Out of Memory" Probleme (Nicht zuletzt wegen geringen Arbeitsspeicher (4 GB)). Einzige Möglichkeit sehe ich, die Datensätze nur Häppchenweiße einzulesen. Schön finde ich das allerdings nicht, wie ich finde.
Gibt es noch effektivere Möglichkeiten als diese hier? Hier mein Grundgerüst:
Delphi-Quellcode:
var
temp , stop, a: integer;
begin
// temp ist der "eigene Datensatz Zähler"
//temp := 0; //Anfang der ID's
Form1.ZQuery3.Close;
Form1.ZQuery3.SQL.Clear;
Form1.ZQuery3.SQL.Text := '
select min(id) as mm from tabelle1;';
Form1.ZQuery3.Open;
temp := StrToInt(Form1.ZQuery3.FieldByName('
mm').AsString);
while stop = 0
do begin //Datensätze nur abschnittsweise laden
Form1.ZQuery1.Close;
Form1.ZQuery1.SQL.Clear;
Form1.ZQuery1.SQL.Text := '
select id,* from tabelle1 where id >= "'+IntToStr(temp)+'
" Limit 100;';
// Limit 100: Ggf. verkleinern
Form1.ZQuery1.Open;
Form1.ZQuery3.Close;
Form1.ZQuery3.SQL.Clear;
Form1.ZQuery3.SQL.Text := '
select max(id) as mm from tabelle1';
Form1.ZQuery3.Open;
if (((StrToInt(Form1.ZQuery3.FieldByName('
mm').AsString)-2)) <= temp)
then begin stop :=1; exit;
end;
// Wenn Ende erreicht von DB, dann Schleife beenden
for a := 0
to ZQuery1.RecordCount-1
do begin
// *** Hier die einzelnen Datensätze verarbeiten ***
end;
//for
end;
//while
end;
Liebe Grüße