Hallo...
Ich bin im Thema Datenbank recht frisch,aber ich komme um dieses Thema notgedrungen nicht herum
Ich bin gerade dabei einen Parser zu schreiben,der Daten aus einer ASCII Datei vom "Menschen lesbaren" Format in einen "Maschinen lesbaren" Format extrahieren soll.
Das klappt mitlerweile auch recht gut.
Die geparsten Daten werden im moment in einem Stringgrid
zwischengelagert. Wenn der Parse Vorgang abgeschlossen ist,so
sollen verschiedene Daten in verschiedene Tabellen einer Accessdatenbank geschrieben werden.
Hierbei muß überprüft werden,ob die Daten schon vorhanden sind,weil sich dort Daten ändern könnten.
Ich muß also per Locate auf vorhanden sein prüfen und dann zwischen APPEND und EDIT entscheiden.
Ich habe vorher mit TDatasource gearbeitet,da hat das eintragen
von ca. 35000 Datensätzen aber 7 (!!!) Minuten gedauert.
Und das war erst eine Tabelle von vielen.
Nachdem ich mich im Internet etwas durchgewühlt habe,bin ich dann auf UPDATEBATCH gestoßen..
Der folgende Code braucht zum schreiben/ändern der rund 35000 Datensätze aber auch noch 6-7 Minuten.
Das dauert einfach zu lange,weil noch mehrere Tabellen mit
Daten gefüllt werden müßen (wenn auch nicht ganz so umfangreich).
Das ganze läuft auf W2K,Athlon64 3500+ unter Delphi 7
Hier der Code:
adodataset1.Close;
adodataset1.DisableControls;
adodataset1.LockType:=ltBatchOptimistic;
adodataset1.CommandText:='SELECT * FROM pl_zo';
adodataset1.Open;
for x:=1 to stringgrid2.RowCount-2 do
with adodataset1 do
try
if Locate('pl_nr;pl_zo_nr',VarArrayOf([strtoint(stringgrid2.Cells[0,x]),strtoint(stringgrid2.Cells[2,x]) ]),[])=false then Append else Edit;
if stringgrid2.Cells[0,x]<>'' then findfield('pl_nr').AsInteger:=strtoint(stringgrid2 .Cells[0,x]) else findfield('pl_nr').AsInteger:=-1; //Nummer Planet
if stringgrid2.Cells[1,x]<>'' then findfield('pl_dimension').Text:=Stringgrid2.Cells[1,x] else findfield('pl_dimension').text:=' ';
if stringgrid2.Cells[2,x]<>'' then findfield('pl_zo_nr').asinteger:=strtoint(Stringgr id2.Cells[2,x]) else findfield('pl_zo_nr').asinteger:=-1;
if stringgrid2.Cells[3,x]<>'' then findfield('pl_zo_namen').text:=stringgrid2.Cells[3,x] else findfield('pl_zo_namen').text:=' ';
if stringgrid2.Cells[4,x]<>'' then findfield('pl_zo_besitzer').text:=stringgrid2.Cell s[4,x] else findfield('pl_zo_besitzer').text:=' ';
if stringgrid2.Cells[5,x]<>'' then findfield('pl_zo_fus').asinteger:=strtoint(Stringg rid2.Cells[5,x]) else findfield('pl_zo_fus').asinteger:=-1;
if stringgrid2.Cells[6,x]<>'' then findfield('pl_zo_beschreibung').asstring:=stringgr id2.Cells[6,x] else findfield('pl_zo_beschreibung').asstring:='';
if stringgrid2.Cells[7,x]<>'' then findfield('pl_zo_temp').asstring:=stringgrid2.cell s[7,x] else findfield('pl_zo_temp').asstring:='';
if stringgrid2.Cells[8,x]<>'' then findfield('pl_zo_nied').asstring:=Stringgrid2.Cell s[8,x] else findfield('pl_zo_nied').asstring:='';
if stringgrid2.Cells[9,x]<>'' then findfield('pl_zo_ivo').asstring:=stringgrid2.cells[9,x] else findfield('pl_zo_ivo').asstring:='';
if stringgrid2.Cells[10,x]<>'' then findfield('pl_zeit').asinteger:=strtoint(Stringgri d2.Cells[10,x]) else findfield('pl_zeit').asinteger:=-1;
//if stringgrid2.Cells[11,x]<>'' then findfield('pl_techlevel').asinteger:=strtoint(stri nggrid2.cells[11,x]) else findfield('pl_techlevel').asinteger:=-1;
post;
except
showmessage('Problem bei schreiben der pl_zonen');
end;
adodataset1.UpdateBatch(arall);
Ich habe auch mal das gleiche versucht,indem ich per "Select * FROM pl_zo Where 1=2" die daten direkt per APPEND und OHNE LOCATE in das AdoDataset geschrieben habe.
Das hat etwas über 2 Minuten gedauert. Auch kein sehr schnelles
Resultat,allerdings besser als 6,7 oder 8 Minuten...
Allerdings wurden die Daten bei UPDATEBATCH an die schon vorhandenen Daten angehängt,was ich nicht gebrauchen kann.
Jeder Eintrag darf nur einmal vorhanden sein...
Kann mir jemand vielleicht irgendwelche Tipps geben,die auch
für Datenbank Laien verständlich sind und die die Performance erhöhen und die extremen Speicherzeiten auf ein erträgliches Maß
reduzieren ???
Danke schonmal im vorraus...
Cya de Helge
Ich bin im Thema Datenbank recht frisch,aber ich komme um dieses Thema notgedrungen nicht herum
Ich bin gerade dabei einen Parser zu schreiben,der Daten aus einer ASCII Datei vom "Menschen lesbaren" Format in einen "Maschinen lesbaren" Format extrahieren soll.
Das klappt mitlerweile auch recht gut.
Die geparsten Daten werden im moment in einem Stringgrid
zwischengelagert. Wenn der Parse Vorgang abgeschlossen ist,so
sollen verschiedene Daten in verschiedene Tabellen einer Accessdatenbank geschrieben werden.
Hierbei muß überprüft werden,ob die Daten schon vorhanden sind,weil sich dort Daten ändern könnten.
Ich muß also per Locate auf vorhanden sein prüfen und dann zwischen APPEND und EDIT entscheiden.
Ich habe vorher mit TDatasource gearbeitet,da hat das eintragen
von ca. 35000 Datensätzen aber 7 (!!!) Minuten gedauert.
Und das war erst eine Tabelle von vielen.
Nachdem ich mich im Internet etwas durchgewühlt habe,bin ich dann auf UPDATEBATCH gestoßen..
Der folgende Code braucht zum schreiben/ändern der rund 35000 Datensätze aber auch noch 6-7 Minuten.
Das dauert einfach zu lange,weil noch mehrere Tabellen mit
Daten gefüllt werden müßen (wenn auch nicht ganz so umfangreich).
Das ganze läuft auf W2K,Athlon64 3500+ unter Delphi 7
Hier der Code:
adodataset1.Close;
adodataset1.DisableControls;
adodataset1.LockType:=ltBatchOptimistic;
adodataset1.CommandText:='SELECT * FROM pl_zo';
adodataset1.Open;
for x:=1 to stringgrid2.RowCount-2 do
with adodataset1 do
try
if Locate('pl_nr;pl_zo_nr',VarArrayOf([strtoint(stringgrid2.Cells[0,x]),strtoint(stringgrid2.Cells[2,x]) ]),[])=false then Append else Edit;
if stringgrid2.Cells[0,x]<>'' then findfield('pl_nr').AsInteger:=strtoint(stringgrid2 .Cells[0,x]) else findfield('pl_nr').AsInteger:=-1; //Nummer Planet
if stringgrid2.Cells[1,x]<>'' then findfield('pl_dimension').Text:=Stringgrid2.Cells[1,x] else findfield('pl_dimension').text:=' ';
if stringgrid2.Cells[2,x]<>'' then findfield('pl_zo_nr').asinteger:=strtoint(Stringgr id2.Cells[2,x]) else findfield('pl_zo_nr').asinteger:=-1;
if stringgrid2.Cells[3,x]<>'' then findfield('pl_zo_namen').text:=stringgrid2.Cells[3,x] else findfield('pl_zo_namen').text:=' ';
if stringgrid2.Cells[4,x]<>'' then findfield('pl_zo_besitzer').text:=stringgrid2.Cell s[4,x] else findfield('pl_zo_besitzer').text:=' ';
if stringgrid2.Cells[5,x]<>'' then findfield('pl_zo_fus').asinteger:=strtoint(Stringg rid2.Cells[5,x]) else findfield('pl_zo_fus').asinteger:=-1;
if stringgrid2.Cells[6,x]<>'' then findfield('pl_zo_beschreibung').asstring:=stringgr id2.Cells[6,x] else findfield('pl_zo_beschreibung').asstring:='';
if stringgrid2.Cells[7,x]<>'' then findfield('pl_zo_temp').asstring:=stringgrid2.cell s[7,x] else findfield('pl_zo_temp').asstring:='';
if stringgrid2.Cells[8,x]<>'' then findfield('pl_zo_nied').asstring:=Stringgrid2.Cell s[8,x] else findfield('pl_zo_nied').asstring:='';
if stringgrid2.Cells[9,x]<>'' then findfield('pl_zo_ivo').asstring:=stringgrid2.cells[9,x] else findfield('pl_zo_ivo').asstring:='';
if stringgrid2.Cells[10,x]<>'' then findfield('pl_zeit').asinteger:=strtoint(Stringgri d2.Cells[10,x]) else findfield('pl_zeit').asinteger:=-1;
//if stringgrid2.Cells[11,x]<>'' then findfield('pl_techlevel').asinteger:=strtoint(stri nggrid2.cells[11,x]) else findfield('pl_techlevel').asinteger:=-1;
post;
except
showmessage('Problem bei schreiben der pl_zonen');
end;
adodataset1.UpdateBatch(arall);
Ich habe auch mal das gleiche versucht,indem ich per "Select * FROM pl_zo Where 1=2" die daten direkt per APPEND und OHNE LOCATE in das AdoDataset geschrieben habe.
Das hat etwas über 2 Minuten gedauert. Auch kein sehr schnelles
Resultat,allerdings besser als 6,7 oder 8 Minuten...
Allerdings wurden die Daten bei UPDATEBATCH an die schon vorhandenen Daten angehängt,was ich nicht gebrauchen kann.
Jeder Eintrag darf nur einmal vorhanden sein...
Kann mir jemand vielleicht irgendwelche Tipps geben,die auch
für Datenbank Laien verständlich sind und die die Performance erhöhen und die extremen Speicherzeiten auf ein erträgliches Maß
reduzieren ???
Danke schonmal im vorraus...
Cya de Helge
Comment