Hallo Markus,
In der Datenbank sind derzeit ca. 4.500 Datensätze.
Bei jedem ca. halbjährlichen Import kommen ca. 300 - 500 Datensätze hinzu.
Bei dem Import müsste anhand von einer eindeutigen Kundennummer und einer weiteren eindeutigen Nummer geprüft werden, ob dieser Datensatz bereits existiert.
Wenn ja, soll der bestehende mit neuen Infos ergänzt werden,
wenn nein, soll der Datensatz neu angelegt werden.
Ich mache das performanceoptimiert so:
1. Der Import liest per OLE die Excel Zeilen ein. Vorher passiert noch (4.)
2. Über die gelesene Excel Zeile wird ein Hash-Wert berechnet, der zusätzlich zu den Daten im angelegten Dokument gespeichert wird (geht am einfachsten und schnellsten mit Evaluate("@Password(<geleseneZeile>)").
3. In der Datenbank gibt es eine versteckte Ansicht, die zwei Spalten hat: Erste Spalte ist eine eindeutige Kennung des Datensatzes (sortiert), also die Kundennummer + weitere Nummern. Die zweite Spalte ist der Hash Wert des Dokuments.
4. Als erstes im Import Agent läuft ein viewNavigator über diese Ansicht, holt sich die Werte per viewEntry.Columnvalues() und merkt sich alle Kombinationen in einer Liste: Hash(<eindeutiger Schlüssel>) = Hashwert. Das geht durch den viewNavigator rasend schnell, weil keine Dokumente gelesen werden, sondern nur auf den view Index zugegriffen wird. Dem kann man sicherheitshalber vorher noch ein view.Refresh() geben.
5. Nach jeder gelesenen Excel Zeile berechnet der Import Agent erst einmal den Hash Wert dieser Zeile und prüft, ob er in der Hash Liste aus (4) enthalten ist. Wenn ja, ist der Datensatz vorhanden und wurde nicht geändert, also nächster Datensatz. Wenn der Wert nicht gefunden wird, ist der Datensatz neu oder wurde geändert, also Datensatz per view.GetDocumentByKey(.., True) holen und aktualisieren bzw. neu anlegen. Nicht vergessen, den Hash Wert beim Update neu zu berechnen.
Das ganze ist extrem schnell, weil die Dokumente nur dann gelesen werden müssen, wenn an diesem Dokument auch tatsächlich Änderungen gemacht wurden. Wenn nur wenige Änderungen nötig sind, ist der Agent selbst bei großen Datenbanken schneller fertig, als man die Konsole aufrufen kann, um ihn zu kontrollieren...
Die einzig bremsende Komponente bei dem Verfahren ist nur noch der OLE Zugriff. Wenn man den durch Textdateien ersetzt, wird das ganze noch einmal ein gutes Stück schneller. Das würde ich vor allem dann machen, wenn größere Änderungen zu erwarten sind.