Datenbank INSERT OR UPDATE
Methoden sind unglaublich teuer, da die Datenbank nicht alle Commits gleichzeitig abarbeiten kann und sie Zeile für Zeile ausführen muss (ACID-Transaktionen erzwingen dies, weil sie versucht haben, eine Einfügung durchzuführen und dann alle die anderen Datensätze in diesem Commit würden ebenfalls fehlschlagen).
Bei großen Massenoperationen empfiehlt es sich immer vorzubestimmen, ob ein Datensatz eingefügt oder aktualisiert wird, bevor das Commit an die Datenbank übergeben und dann zwei Transaktionen an die Datenbank gesendet werden.
Ein typischer Job, der diese Funktionalität benötigt, würde die Daten, die INSERT OR UPDATEd
sein sollen, zusammenstellen und dann die Datenbanktabelle nach den vorhandenen Primärschlüsseln abfragen. Wenn der Primärschlüssel bereits vorhanden ist, können Sie diesen als UPDATE
senden, andernfalls ist es ein INSERT
. Die Logik dafür kann leicht in einer Komponente tMap
durchgeführt werden.
In dieser Arbeit haben wir einige Daten, die wir INSERT OR UPDATE
in einer Datenbanktabelle wünschen, dass einige bereits vorhandene Daten enthält:
Und wir möchten folgende Daten hinzufügen es:
Der Job arbeitet, indem er die neuen Daten in eine tHashOutput
Komponente wirft, so dass er mehrmals im selben Job verwendet werden kann (er legt ihn einfach in den Speicher oder in großen Fällen kann er ihn auf der Festplatte zwischenspeichern).
Im Anschluss wird eine Datenmenge von einer tHashInput
Komponente ausgelesen und direkt in eine tMap
. Eine weitere tHashInput
Komponente verwendet wird, um eine parametrisierte Abfrage für die Tabelle auszuführen:
Sie this guide to Talend and parameterised queries nützlich finden können. Von hier aus werden die zurückgegebenen Datensätze (also nur diejenigen, die bereits in der Datenbank sind) als ein Lookup für die tMap
verwendet.
Dies wird dann als INNER JOIN
konfigurieren, um die Datensätze zu finden, die UPDATED
mit dem Spuck vom INNER JOIN
sein muß eingefügt werden:
Diese Ausgänge fließen dann nur tMySQLOutput
Komponenten UPDATE
zu trennen oder INSERT
nach Bedarf. Und schließlich, wenn der Haupt-Sub-Job abgeschlossen ist, wir commit
die Änderungen.
Hat Talend eine "Bulk Load", "Bulk Insert" oder "Bulk Copy" Funktion? – RBarryYoung
Und überprüfen Sie Ihre Hardware. 17 ist erbärmlich sogar für ein single-threaded individuelles sql-Statement-Ding. Vielleicht ist Ihr Server eher wie ein Mobiltelefon oder ein Laptop. Wie hoch ist die Latenz zwischen der App und dem Server? – TomTom
Langsamkeit könnte aufgrund eines beliebigen Faktors, wie Netzwerkgeschwindigkeit zwischen Talend und Ihre DB, die Art, wie Job in Talend geschrieben wird, Talend hat Massenladekomponenten für SQL-Server, aber mit normalen SQL Server-Komponenten die Leistung, die Sie erleben, ist sehr schlecht . Ich würde vorschlagen, Sie erwähnen mehr Details wie, was SQL ist, die Sie laufen, gibt es irgendeine Art der Verarbeitung auf Talend Seite, was Talend Komponenten Sie in Job usw. verwenden. – garpitmzn