Ich habe eine manuelle Abgleichfunktion von Tabellen geschrieben, welche bei größeren Datenmengen furchtbar lange braucht. Ich weiss momentan nicht genau wo ich den Hebel ansetzen soll, um die Geschwindigkeit erträglich zu machen.
Den Abgleich habe ich folgendermassen programmiert:
von der Hauptdatenbank wird eine Tabelle mittels des BetterADODatasets geöffnet. Das offene Recordset speichere ich dann als XML und packe das ganze als ZIP. Die ZIP-Datei wird dann auf den Rechner der Ziel-Datenbank übertragen (FTP). Das Abgleich-Programm dort entpacht die Datei und lädt das XML-File wieder in ein BetterADODataset.
Dann beginnt der eigentliche Abgleich. Da sich die Struktur der Tabellen gelegentlich ändert und ich nicht immer den Abgleich nachziehen will verwende ich die Fields auflistung.
die qAbgleichDatei ist das BetterADODateset in das die XML-Datei geladen wurde. adoArtikel ist das BetterADODataset, welches mit der Artikeltabelle des SQLServers verbunden ist (cmdTable, clUseClient, ctStatic). Die CurserLocation der Connection ist auf clUseClient gesetzt.
Ein Abgleich von 40000 Datensätzen braucht weit über eine Stunde. Deis kann doch auf einem Core2 Rechner eigentlich nicht normal sein.
Zur Sicherheit läuft der Abgleich in einer Transaktion ab (ist sicher auch relevant).
Ich suche dringend eine Lösung!
Gruß Markus
Den Abgleich habe ich folgendermassen programmiert:
von der Hauptdatenbank wird eine Tabelle mittels des BetterADODatasets geöffnet. Das offene Recordset speichere ich dann als XML und packe das ganze als ZIP. Die ZIP-Datei wird dann auf den Rechner der Ziel-Datenbank übertragen (FTP). Das Abgleich-Programm dort entpacht die Datei und lädt das XML-File wieder in ein BetterADODataset.
Dann beginnt der eigentliche Abgleich. Da sich die Struktur der Tabellen gelegentlich ändert und ich nicht immer den Abgleich nachziehen will verwende ich die Fields auflistung.
Code:
qAbgleichDatei.First; while not qAbgleichDatei.eof do begin loeschen:=qAbgleichDatei.fieldbyname('ArtikelNummer').isnull; if adoArtikel.locate('ArtikelNummer;ArtikelIndex',varArrayOf([qAbgleichDatei.fieldbyname('LArtikelNummer').asinteger,qAbgleichDatei.fieldbyname('LArtikelIndex').asinteger]),[]) then begin if loeschen then begin adoArtikel.edit; adoArtikel.FieldByName('DELETED').asboolean:=true; adoArtikel.post; end else begin adoArtikel.edit; for i:= 0 to adoArtikel.FieldCount-1 do begin if adoArtikel.fieldList.fields[i].Value<>qAbgleichDatei.fieldbyname(adoArtikel.fieldList.fields[i].FieldName).Value then if adoArtikel.fieldList.fields[i].FieldName<>'Beschreibung' then adoArtikel.fieldList.fields[i].Value:=qAbgleichDatei.fieldbyname(adoArtikel.fieldList.fields[i].FieldName).Value end; adoArtikel.FieldByName('DELETED').asboolean:=false; adoArtikel.post; end; end else if not loeschen then begin adoArtikel.insert; for i:= 0 to adoArtikel.FieldCount-1 do begin if adoArtikel.fieldList.fields[i].FieldName<>'Beschreibung' then adoArtikel.fieldList.fields[i].Value:=qAbgleichDatei.fieldbyname(adoArtikel.fieldList.fields[i].FieldName).Value end; adoArtikel.FieldByName('DELETED').asboolean:=false; adoArtikel.post; end; qAbgleichDatei.next; end;
Ein Abgleich von 40000 Datensätzen braucht weit über eine Stunde. Deis kann doch auf einem Core2 Rechner eigentlich nicht normal sein.
Zur Sicherheit läuft der Abgleich in einer Transaktion ab (ist sicher auch relevant).
Ich suche dringend eine Lösung!
Gruß Markus
Comment