SQL DataWarehouse: SQL-Server-Tabelle effizient/zuverlässig aktualisieren (aus Db2 for i)

PWA

Lieutenant
Registriert
Mai 2012
Beiträge
518
Hallo zusammen,

kennt sich hier jemand mit solchen Datenimporten über eine Stored Procedure aus?
Im Data Warehouse sollen vorhandene SQL-Server-Tabellen um neue/aktualisierte Datensätze erweitert bzw. aktualisiert werden. Der Abruf erfolgt über OPENQUERY(<Db2-LinkedServer>, <SELECT-Statement>).

Bisherige Überlegungen


  • Über 5 Mio. Datensätze, d.h. es dauert viel zu lange, immer alle Daten abzuholen, aber beim initialen Befüllen der SQL-Tabelle muss es eben sein.
    • Wie bekommt man das möglichst schnell, aber auch zuverlässig hin?
    • Irgendwelche Ideen, wie man die Abfrage parallelisieren könnte?
    • Die Abfrage darf angeblich nicht alle Datensätze auf einmal abholen, da es sonst zu Abstürzen/Instabilitäten kommen könnte. Ist das üblich? Gibts dafür gängige Größen, wie viele Datensätze man abrufen kann?
    • Was nimmt man hinsichtlich Performance (und Parallelisierungsmöglichkeit) am besten? - SELECT ... INTO, INSERT, MERGE, ...?
  • Die SQL-Tabelle soll täglich um etwa 10000 neue/geänderte Datensätze aktualisiert werden. Die Datensätze haben eine eindeutige ID und einen Timestamp mit dem Zeitpunkt der letzten Änderung.
    • Wie hole ich nur geänderte Datensätze ab, um diesen Prozess möglichst effizient zu gestalten? Würden nur neue Datensätze dazukommen, könnte man einfach alle abrufen, deren ID größer ist, als die maximale ID in der Ziel-Tabelle. Allerdings können auch ältere Datensätze geändert werden. Wie gehe ich hier vor, ohne jedes mal alle 5 Mio. Datensätze auf geänderte Timestamps vergleichen zu müssen? - Wäre hier vielleicht einfach ein MERGE beider Tabellen die beste Lösung? Oder gibts andere? Mir graut es davor, alle gefühlt 50 Spaltenbezeichnungen im MERGE-Statement angeben zu müssen, obwohl es um identisch aufgebaute Datensätze geht...
    • Auch hier spielen natürlich wieder Parallelisierung und "häppchenweiser Datenabruf" eine Rolle.

Eigentlich klingt das alles mehr oder weniger trivial, aber ich steh gerade echt auf dem Schlauch :freak:
Vielleicht habt Ihr ja Tipps für mich, wie man soetwas am geschicktesten angeht... :)
 
Warum sollte man auch immer alle "Daten abholen" Daten aktualisiert man über Update.

Ich würde Dir das Buch SQL der schnelle Einstieg empfehlen...
 
oiisamiio schrieb:
Warum sollte man auch immer alle "Daten abholen" Daten aktualisiert man über Update.

Ich würde Dir das Buch SQL der schnelle Einstieg empfehlen...
Tausche bitte übermäßige Arroganz gegen Satzzeichen ein. Dein Beitrag ist keinesfalls hilfreich und zeigt mir, dass du von der Materie keine Ahnung hast.
 
Ich bin mir nicht sicher, ob Data Warehouse und SQL Server so richtig gut zusammen geht.
Andererseits sind 5 Millionen Datensätze eigentlich keine große Sache für den SQL Server...

Am besten ist wohl ein Bulk Insert über SSIS (Balanced Data Distributor = Parallelisierung), wenn möglich.
Auf jeden Fall: Vor dem Import die Indizierung abschalten und hinterher wieder einschalten und eine Reorganisation der Indizes anstoßen. Bzw. besser noch: Eine Staging DB verwenden.

Richtwert: Auf circa 300.000 Datensätze pro Sekunde müsstest du kommen. Das würde ich anpeilen.

Openquery würde ich persönlich dabei eher meiden, das ist ein krasses Bottleneck.
Lieber einen Export des DB2 und Import in den SQL-Server regelmäßig laufen lassen.

Und Ressourcen sind durch nichts zu ersetzen :) Mehr RAM ist besser als weniger RAM und die CPU(s) dürfen auch von der Marke "Brett" sein. Auf Virtualisierung und Cloud Computing verzichten. Enterprise grade SSDs (I/O optimiert) verwenden, um die Datendateien abzulegen.
 
Zuletzt bearbeitet:
Ich würde das Problem ebenfalls eher über ein SSIS-Package lösen. Aber auch wenn Du es über eine Procedure mittels Linked Server realisieren würdest wäre die Logik äquivalent.
  • Du bestimmst, welchen Timestamp das aktuellste Element im Datawarehouse (DWH) hat.
  • Abrufen aller Datensätze aus der Quelle deren Timestamp größer als dieser ist (warum soll es ein Problem geben aus einer Tabelle mit 5 Mio Datensätze alle abzurufen, die größer als ein bestimmter Wert sind - im Zweifel erstellst Du einen Index auf die Timestamp-Spalte der Quelle.)
  • Einfügen ins DWH mit Merge, bzw. im SSIS Vergleich Quelle-Ziel und bedingtes Teilen in Insert/Update Zweig
  • Besondere Aufmerksamkeit solltest Du dem Löschen von Zeilen schenken. Wenn Du nur die Zeilen ab einem bestimmten Timestamp holst fehlen diese im Quell-Datenset und wenn Du das nicht beachtest löscht Du dir dies dann im Merge.
 
Zurück
Oben