Effiziente Verarbeitung von Unterschieden zwischen Eingabedaten und Datenbank

8

Ich habe einen Eingabedatensatz, dessen Datensätze an eine vorhandene Datenbank angehängt werden. Vor dem Anhängen werden die Daten einer intensiven, zeitintensiven Verarbeitung unterzogen. Ich möchte Datensätze aus dem Eingabedatensatz herausfiltern, die bereits in der Datenbank vorhanden sind, um die Verarbeitungszeit zu verkürzen.

Der Unterschied zwischen Eingabe und Datenbank wird hier dargestellt: Eingabe- und Datenbankunterschied

Dies ist ein Überblick über die Art des Prozesses, den ich betrachte. Die Eingabedaten werden schließlich in die Datenbank eingespeist. Workflow für die Eingabeverarbeitung

Meine aktuelle Lösung besteht darin, einen Matcher-Transformator für die kombinierte Datenbank und Eingabe zu verwenden und dann das NotMatched-Ergebnis mithilfe eines FeatureTypeFilter zu filtern, um nur die Eingabedatensätze beizubehalten.

Gibt es eine effizientere Möglichkeit, die Differenzfunktionen zu erhalten?

Rovyko
quelle
1
Verwenden Sie eine Oracle-Datenbank? Sie können die Datenbank veranlassen, die Arbeit zwischen Delta-Tabellen mit MINUS stackoverflow.com/questions/2293092/…
Mapperz
2
Anstatt alles aus der Datenbank einzulesen, möchten Sie möglicherweise versuchen, a zu verwenden SQLexecutor. Wenn das Attribut _matched_records auf dem Initiator 0 ist, ist es ein Add
MickyT

Antworten:

4

Wenn Sie die im Diagramm angegebenen Datenbankeigenschaften haben. Kleine Eingabe, winzige Überlappung, großes Ziel. Dann kann die folgende Art von Arbeitsbereich sehr effizient arbeiten, obwohl mehrere Abfragen für die Datenbank ausgeführt werden.

Geben Sie hier die Bildbeschreibung ein

Lesen Sie also für jedes Feature aus der Eingabeabfrage das passende Feature in der Datenbank. Stellen Sie sicher, dass geeignete Indizes vorhanden sind. Testen Sie das Attribut _matched_records auf 0, führen Sie die Verarbeitung durch und fügen Sie es in die Datenbank ein.

MickyT
quelle
Ich fand das die schnellste Lösung. Ich vermute, weil es die Datenmenge begrenzt, die aus der Datenbank in FME gezogen wird, und die Verarbeitung auf der SQL-Seite beibehält.
Rovyko
4

Ich habe FME nicht verwendet, aber ich hatte eine ähnliche Verarbeitungsaufgabe, bei der die Ausgabe eines 5-Stunden-Verarbeitungsjobs verwendet werden musste, um drei mögliche Verarbeitungsfälle für eine parallele Datenbank über eine Netzwerkverbindung mit geringer Bandbreite zu identifizieren:

  • Neue Funktionen hinzugefügt werden
  • Bestehende Funktionen müssen aktualisiert werden
  • Vorhandene Funktionen, die gelöscht werden sollen

Da ich die Garantie hatte, dass alle Funktionen zwischen den Durchläufen eindeutige ID-Werte beibehalten, konnte ich:

  1. Führen Sie ein Verarbeitungsskript aus, das eine Tabelle mit {uID, Prüfsummen} -Paaren in den wichtigen Spalten der aktualisierten Tabelle generiert hat
  2. Verwendete die in der vorherigen Iteration generierten {uID, Prüfsummen} -Paare, um Aktualisierungen an die Zieltabelle mit den Zeilen in der aktualisierten Tabelle zu übertragen, in denen sich die uID in einer Unterabfrage befand, in der die Prüfsummen nicht übereinstimmten
  3. Übertragen Sie Einfügungen aus der aktualisierten Tabelle, für die eine angegebene Unterverknüpfungs-Unterabfrage nicht übereinstimmende UIDs hatte, und
  4. Übertrug eine Liste von UIDs zum Löschen von Features in der externen Tabelle, für die eine Unterabfrage für äußere Verknüpfungen angegeben hat, dass die aktuelle Tabelle keine übereinstimmenden UIDs mehr enthält
  5. Speichern Sie die aktuellen {uID, Prüfsummen} -Paare für den Betrieb am nächsten Tag

In der externen Datenbank musste ich nur die neuen Funktionen einfügen, die Deltas aktualisieren, eine temporäre Tabelle mit gelöschten UIDs füllen und die Funktionen in der Löschtabelle löschen.

Ich konnte diesen Prozess automatisieren, um Hunderte von täglichen Änderungen an einer 10-Millionen-Zeilentabelle mit einem Minimum an Auswirkungen auf die Produktionstabelle zu verbreiten, wobei weniger als 20 Minuten tägliche Laufzeit benötigt wurden. Es lief mehrere Jahre mit minimalen Verwaltungskosten, ohne die Synchronisation zu verlieren.

Während es sicherlich möglich ist, N Vergleiche über M Zeilen durchzuführen, ist die Verwendung eines Digests / einer Prüfsumme eine sehr attraktive Möglichkeit, einen "existierenden" Test mit viel geringeren Kosten durchzuführen.

Vince
quelle
4

Verwenden Sie featureMerger, um die allgemeinen Felder von DATABASE AND INPUT DATA zu verknüpfen und zu gruppieren. Geben Sie hier die Bildbeschreibung ein

Jorge Vidinha
quelle