Ich arbeite an einem ETL-Prozess für ein Data Warehouse mit C#, der sowohl SQL Server als auch Oracle unterstützt. Während der Entwicklung habe ich gespeicherte Prozeduren geschrieben, die Daten von einer Datenbank mit einer anderen Datenbank synchronisieren sollten. Der Code der Stored Procedures ist ziemlich hässlich, weil er dynamisches SQL beinhaltet. Er muss die SQL-Strings erstellen, da wir dynamische Datenbanknamen haben.
Mein Teamleiter möchte C#-Code zur Durchführung der ETL verwenden. Wir haben eine Codegenerierung, die automatisch neue Klassen generiert, wenn sich die Datenbankdefinition ändert. Das ist auch der Grund, warum ich beschlossen, nicht Rhino ETL zu verwenden.
Hier sind die Vor- und Nachteile:
Gespeicherte Prozedur:
Vorteile:
- schneller Ladevorgang, alles wird von der Datenbank erledigt
- einfache Bereitstellung, keine Kompilierung erforderlich
Nachteile
- schlechte Lesbarkeit aufgrund von dynamischem SQL
- Notwendigkeit, bei Änderungen der Datenbankdefinition sowohl T-SQL- als auch PL/SQL-Skripte zu pflegen
- Langsame Entwicklung, da keine Intellisense beim Schreiben von dynamischem SQL
C# Code:
Vorteile:
- einfacher, den ETL-Prozess zu entwickeln, weil wir Intellisense von unserer generierten Klasse erhalten
- leichter zu pflegen, da die Klasse generiert wird
- bessere Protokollierung und Fehlerbehandlung
Nachteile:
- langsame Leistung im Vergleich zu gespeicherten Verfahren
Ich würde es vorziehen, für den ETL-Prozess Anwendungscode zu verwenden, aber die Leistung war im Vergleich zu gespeicherten Prozeduren entsetzlich. In einem Test habe ich versucht, 10.000 Zeilen zu aktualisieren. Die gespeicherten Prozeduren brauchten nur 1 Sekunde, während mein ETL-Code 70 Sekunden brauchte. Selbst wenn es mir irgendwie gelingt, den Overhead zu reduzieren, entfallen 20 % der 70 Sekunden auf den reinen Aufruf der Aktualisierungsanweisung im Anwendungscode.
Könnte mir jemand Vorschläge oder Kommentare dazu geben, wie man den ETL-Prozess mit Hilfe von Anwendungscode beschleunigen kann?
Meine nächste Idee ist es, einen parallelen ETL-Prozess zu versuchen, indem ich mehrere Datenbankverbindungen öffne und die Aktualisierung und Einfügung durchführe.
Gracias