6 Stimmen

Entwurf und Leistung der ETL-Verarbeitung

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

2voto

Unreason Punkte 12300

Sie sagen, Sie haben eine Codegenerierung, die automatisch neue Klassen erzeugt - warum haben Sie keine Codegenerierung, die automatisch neue gespeicherte Prozeduren erzeugt?

Das sollte Ihnen das Beste aus zwei Welten geben; kapseln Sie es in ein paar nette Klassen, die die Datenbank inspizieren und Dinge wie nötig aktualisieren können, und Sie können, auch nicht die Lesbarkeit erhöhen, aber verstecken Sie es (Sie würden nicht brauchen, um die SPs manuell aktualisieren)

Außerdem sollte der Unterschied nicht so groß sein. Das klingt, als ob Sie etwas nicht richtig machen (Wiederverwendung von Verbindungen, unnötiges Verschieben von Daten vom Server zur Anwendung oder Verarbeitung von Daten in kleineren Stapeln - Zeile für Zeile?)

Und was die bessere Protokollierung angeht - könnten Sie das näher erläutern? Sie können die Protokollierung auch auf der Datenbankebene durchführen, oder Sie können Ihre SPs so gestalten, dass die Anwendungsschicht die Protokollierung übernehmen kann.

2voto

guigui42 Punkte 2311

Wenn Ihr C#-Code schon bei 10.000 Zeilen langsam ist, kann ich mir das in einer realen Umgebung nicht vorstellen...

Die meisten ETLs werden entweder innerhalb der Datenbank durchgeführt ( gespeicherte Verfahren , Pakete oder sogar innerhalb der Datenbank kompiliert (PL/SQL, Java für Oracle)). Sie können Millionen von Zeilen verarbeiten.

Es können auch professionelle Tools verwendet werden (Informatica oder andere), die jedoch langsamer sind als gespeicherte Verfahren, aber leichter zu verwalten.

Meine Schlussfolgerung ist also: Wenn Sie auch nur annähernd die Leistung einer gespeicherten Prozedur erreichen wollen, müssen Sie eine Anwendung programmieren, die so gut ist wie die professionellen Anwendungen auf dem Markt, deren Entwicklung und Reifung Jahre gedauert hat... Glauben Sie, dass Sie das können?

Und wenn Sie mit verschiedenen Datenbanktypen arbeiten müssen ( SQL-Server Oracle), können Sie NICHT gleichzeitig eine generische Anwendung erstellen UND sie optimieren, es ist eine Wahl. Denn Oracle funktioniert nicht auf die gleiche Weise wie SQL Server.

Um Ihnen eine Vorstellung davon zu geben, werden in ETLs für Oracle Hinweise verwendet (wie die Hinweise zur parallelen Ausführung), und auch einige Indizes können vorübergehend gelöscht oder die Integrität deaktiviert werden, um die ETL zu optimieren.

Soweit mir bekannt ist, gibt es keine Möglichkeit, in SQL Server genau dasselbe zu tun (sie haben vielleicht ähnliche Optionen, aber eine andere Syntax). Eine ETL für alle Datenbanken" ist also kaum möglich, ohne dass Effizienz und Geschwindigkeit verloren gehen.

Ich denke also, dass Ihre Vor- und Nachteile sehr zutreffend sind; man muss sich zwischen Geschwindigkeit und Einfachheit der Entwicklung entscheiden, aber nicht zwischen beidem.

0voto

Bonshington Punkte 3752

Vielleicht sollten Sie Ihre Bewerbung überarbeiten.

Ein paar Tricks von mir:

  • Verwenden Sie connection.Open() und conenction.Close() nicht zu oft.
  • In einigen Fällen wird LINQ die Dinge verlangsamen
  • Verwenden Sie eine Prozedur und übergeben Sie beim Laden mehr Parameter, um beispielsweise die Anzahl der Aufrufe zu verringern, proc_load_to_table(p1 text) Wechsel zu proc_load_to_table(p1 text, p2 text, p3 text, p4 tex, p5 text)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X