SqlBulkUnit

Gruppe

Integration Units

Funktion

Ist für den Insert von Massendaten in eine Datenbanktabelle bestimmt.

Beschreibung


Die SqlBulkUnit ist für den Insert von Massendaten in eine Datenbanktabelle bestimmt. Gegenüber dem Insert in Phase 4 ist eine deutlich größere Geschwindigkeit möglich, durch die Anwendung des Bulk-Inserts. Wichtiger Hinweis: Bei Verwendung dieser Integration Unit muss die SQL-Ausführung in Phase 4 abgeschaltet werden. Das wird durch die Integration Unit übernommen! Zudem darf die Knoten-Eigenschaft "Gilt nur für SQL" nicht verwendet werden.


Die Integration Unit beachtet folgende SQL-relevante Knoten-Eigenschaften der Zielstruktur

  • DB Alias. Hinweis: Ausgewertet werden nur Fixwerte und System-Konstanten, aber keine Variablen.

  • SQL Tabelle/Procedure. Wichtiger Hinweis: Bitte Beschreibung von Integration Unit-Parameter Allow dynamic table names beachten.

  • Tabelle leeren.

  • SQL Modus. Möglich sind hier neben insert auch only update und only delete, falls mindestens ein Feld das Attribut SQL Schlüssel gesetzt hat und das Integration-Unit-Parameter Use prepared statements auf true gesetzt ist.

  • Hinweis: Opt. Pre-SQL Ausführung und die Transaktionssteuerung werden nicht beachtet.


Die Integration Unit beachtet folgende SQL-relevante Feld-Eigenschaften der Zielstruktur

  • SQL Spaltenname.

  • Hinweis: SQL AutoGenKey wird generell nicht beachtet. SQL Schlüssel wird lediglich im SQL Modus insert nicht beachtet.

  • Hinweis: Leeren Wert bei SQL überspringen wird nicht beachtet.

Beschreibung der Parameter


Parametername

Erlaubte Werte

Default-Wert

Beschreibung

Allow dynamic table names

true, false

false

Bei true ist die Benutzung von Variablen/Konstanten als Tabellen-Name (im Attribut SQL Table/Procedure in Zielstruktur-Knoten) erlaubt. Bei false sind lediglich Fixwerte und System-Konstanten erlaubt. Wichtiger Hinweis: Die Auflösung von Variablen erfolgt nur einmal! Wird ein SQL-Knoten mehrfach durchlaufen, der Tabellenname durch eine Variable angegeben und der Wert der Variable ändert sich nach dem ersten Durchlauf, dann wird weiterhin der vorherige Variablenwert verwendet!

CSV delimiter for direct call


;

Das Feld-Trennzeichen, wenn direkt über die Backup-Datei aufgerufen wird (siehe "direct call" unten).

Commit at end and not after each batch

true, false

false

Bei eingeschalteter Option (true) werden die Daten erst nach dem letzten Datensatz committet. Das kann zu einem Datenbankfehler führen, wenn der Tablespace für Transactions zu klein ist.

Encoding to use for BLOB fields


8859_1

Die Zeichenkodierung, die für BLOB-Felder verwendet wird.

Escape character to mask ' if no prepared statements are used


'

Wird nur beachtet, wenn keine Prepared Statements verwendet werden. Das SQL-Sonderzeichen Apostroph darf dann in einem Feldwert nicht vorkommen. Falls das nicht ausgeschlossen werden kann, muss man hier das von der Datenbank abhängige Escape-Zeichen angeben. Das führt zu Geschwindigkeitsverlusten. Lassen Sie diesen Parameter leer, wenn Sie ausschließen können, dass in den Feldwerten ein Apostroph vorkommt.

Max. sql statements in batch


500

Wenn das SQL-Statement die angegebene Größe erreicht hat, wird ein Commit ausgeführt. Diese Option ist nur wirksam, wenn Use autocommit und Commit only at end auf false gesetzt sind.

Node name for simple bulk operation



Name des Knotens der für Insert verwendet werden soll (für Variante "direct call", siehe unten).

Replace empty string with NULL

true, false

false

Leere CSV-Felder werden beim Insert durch NULL ersetzt.

Target system is Salesforce

true, false

false

true, wenn das Zielsystem Salesforce ist.

Use autocommit on

true, false

false

Entscheidet, ob jeder Datensatz sofort committet wird. Je nach Datenbank kann das ein Vorteil sein, oder auch nicht, weil dann keine Transaktion erzeugt wird, aber andererseits die Daten sofort geschrieben werden.

Use prepared statements

true, false

true

Je nach Datenbanktyp kann es ein Vorteil sein mit Prepared Statements zu arbeiten, oder auch nicht. Gesetzt wird die Option hier.

Use truncate instead of delete cmd

true, false

false

true, wenn truncate statt delete verwendet werden soll.


Hinweis: Siehe auch Abschnitt Umschreibung nicht druckbarer Trennzeichen.

Anwendung


Die große Datenmenge sollten am Besten mittels DefaultFileSQLCron durch den zeitgesteuerten Eingangsagenten Eigene Klasse beschafft werden.

Es wird zwischen 2 Varianten unterschieden:


  • Wird "Variante 1 - mit Mapping" benutzt, stellen Sie bitte sicher, das der Preparser TokenStreamSplitter eingetragen wird. Je nach Breite der Tabelle (Spaltenanzahl) und verfügbarem Speicher sollten Sie einen Wert finden, der Ihrem System entspricht.

  • Wird "Variante 2 - ohne Mapping (direct call)" verwendet, tragen Sie bitte den Preparser DummyPreParser ein.

Beispiele


Variante 1 - mit Mapping

Sollen Daten manipuliert werden, müssen diese im Profil gemappt werden. Hierzu ist ein Profil aufzusetzen, das die Daten mappt und ggf. Funktionen ausführt. Bei dem Einsatz der Integration Unit ist aber zu beachten, dass nicht alle Möglichkeiten der Feld- und Knoteneinstellungen berücksichtigt werden. Folgendes gilt:


  • Formatvorgaben (Maskierungen) werden nicht zurück gerechnet (Beispiel: Formatvorlage für Datum wird nicht in ein SQL-Datum zurück gerechnet).

  • SQLAutoGenKey-Eigenschaft wird nicht beachtet.

  • Transaktionssteuerung der Knoten werden nicht beachtet - es gelten die Einstellungen der Unit.

Wichtiger Hinweis: Stellen Sie sicher, dass die Swapping-Einstellungen in Phase 2/Erweitert auf 0 % Speicherbelegung eingestellt sind!


Variante 2 - ohne Mapping (direct call)

Sind die Eingangsdaten bereits passend in Format und Reihenfolge, bietet sich diese Variante an: Die Eingangsdaten werden dem Zielbaum Satzweise direkt aus der Backupdatei zugeführt. Es werden keine Datenblätter erzeugt, da nur ein Datensatz (bzw. eine Zeile) im Speicher ist. Spalten werden dem Knoten zugewiesen, dessen Name der ersten Spalte des Eingangsdatensatzes entspricht. Wird also z. B. select 'A', col1, col2 from xyz im Eingangsagenten ausgeführt, wird der Knoten A in der Zielstruktur gesucht. Dieser muss einen Datenbank-Alias und Tabellennamen eingetragen haben und als aktiv gekennzeichnet sein. Der Wert von col1 wird dem ersten Feld unter Knoten A mit einem eingetragenen SQL-Spaltennamen zugewiesen, col2 dem nächsten Feld mit einem SQL-Spaltennamen, etc. Um Variante 2 zu nutzen, muss als Preparser com.ebd.hub.datawizard.parser.DummyPreParser eingetragen sein. Die Quellstruktur hat nur einen Knoten mit einem Feld, das den Wert dummy data des Preparsers entgegennimmt.

Wichtiger Hinweis: Funktionen und Zuweisungen werden nicht ausgeführt!

In Variante 2 werden keine Datenblätter geschrieben und keine Mappinginstruktionen ausgeführt, da die Logik wie in "Variante 2 - ohne Mapping" beschrieben durchgeführt wird. Die Zeit sollte linear mit der Anzahl der gelesenen, bzw. geschrieben Datensätze wachsen, der Speicherverbrauch für dieses Profil ist konstant niedrig und unabhängig von der Anzahl der Datensätze und die CPU-Last entsteht überwiegend auf der Seite des Datenbank-Servers.

Falls die Backup-Datei des Jobs durch den DefaultSQLCron (oder eine Variante davon) erzeugt wurde, sind die Felder durch Strichpunkt getrennt. Das entspricht der Default-Einstellung des Parameters CSV delimiter for direct call.

Mögliche Fehler


Auch wenn diese Integration Unit für das Einfügen von Massendaten ausgelegt ist, kann es bei großen Datenmengen zu Fehlern kommen. Als Beispiel hier folgende Fehlermeldung bei der Verwendung eines Microsoft SQL Servers.


...
... IntegrationUnit reported exception, aborting request com.ebd.hub.iu.UnitTransactionException: null
Nested exception-message is: There is insufficient system memory in resource pool 'internal' to run this query.
...
Nested exception is: com.microsoft.sqlserver.jdbc.SQLServerException: There is insufficient system memory in resource pool 'internal' to run this query.
...


Der Fehler kommt hier nicht direkt von der Integration Unit, sondern von der Datenbank selbst. In diesem Fall könnte man dem Microsoft SQL Server mehr Speicher geben (das finden Sie in der Hersteller-Dokumentation beschrieben) oder den Wert des Integration-Unit-Parameters Max. sql statements in batch verringern (siehe oben).