Fact Table Partitionierung: Wie man Updates in ETL behandelt?

Wir versuchen, die Tabellenpartitionierung für eine Data Warehouse Fact-Tabelle zu implementieren, die ca. 400M Zeilen enthält. Unsere ETL nimmt data aus dem Quellsystem 50 Tage rückwärts (neue Zeilen, modifizierte Zeilen, basierend auf Quellsystem-timestempel) aus der vorherigen Last. In jedem ETL-Zyklus gibt es also neue Zeilen, und auch alte Zeilen, die die entsprechenden Zeilen in der Fact-Tabelle aktualisieren. Die Idee besteht darin, neue Zeilen in die Fact-Tabelle einzufügen und modifizierte Zeilen zu aktualisieren.

Die Partitionssäule wäre das date (int, YYYYMMDD) und wir erwägen die Teilung nach Monat.

Soweit es mich betrifft, würde die Tabellenpartitionierung unsere Einsätze über schnelle Trennschalteroperationen erleichtern. Wir konnten die aktuellste Partition aufteilen, um eine neue freie Partition zu erstellen, neue Zeilen in eine Staging-Tabelle zu laden (unter Verwendung von datesbeschränkung, z. B. für den letzten Monat) und dann die Partitionsschalteroperation verwenden, um neue Zeilen in die partitionierte Fact-Tabelle zu verschieben . Aber wie können wir mit den geänderten Zeilen umgehen, die die entsprechenden Zeilen in der Fact-Tabelle aktualisieren sollen? Diese Zeilen können data aus dem Vormonat (s) enthalten. Macht der Partitionsschalter hier? Normalerweise werden INSERT und UPDATE Zeilen durch ein ETL-Tool (zB SSIS in unserem Fall) oder durch MERGE statement bestimmt. Wie funktioniert die Partitionierung in solchen Situationen?

Ich würde noch einen Blick auf das Design casting und versuchen, herauszufinden, ob es einen path um die Updates gibt. Hier sind ein paar Implikationen der Aktualisierung der Faktentabelle:

performance: Updates sind vollständig protokollierte transactions. Große Fakten Tabellen haben auch viele data zu lesen und zu schreiben.

Cubes: Das Aktualisieren der fact-Tabelle erfordert die Wiederaufbereitung der betroffenen Partitionen. Da Ihre Fakten-Tabelle weiter wächst, wird die Cube-Bearbeitungszeit auch weiterhin fortgesetzt.

Budget: Schnelle Lagerung ist teuer. Das Aktualisieren großer Fakten-Tabellen erfordert viel schnelles Lesen und Schreiben.

Puristische Theorie: Sie sollten die Faktentabelle nicht ändern, es sei denn, der Anfangswert war ein Fehler (dh der Benutzer hat $ 15.000 statt $ 1.500 eingegeben). Jedes Nicht-Fehler-Szenario wird die ursprünglich aufgezeichnete Transaktion ändern.

Was ändert sich Sind die wechselnden Stücke wirklich Attribute einer Dimension? Wenn ja, können sie in eine Dimension verschoben werden und haben Änderungen mit einer langsam ändernden Dimension Typ Aufgabe behandelt?

Eine andere Möglichkeit, kann dies durch Verrechnungsgeschäfte erreicht werden? Beispiel:

Die anfängliche InvoiceAmount war $ 10,00. Buchhaltung später hinzugefügt $ 1,25 für die Steuer dann berechnet den Kunden für $ 11,25. Anstatt den Wert auf $ 11,25 zu aktualisieren, füge einen datasatz für $ 1,25 ein. Der Summenbetrag für die Rechnung ist immer noch $ 11,25 und Sie können ein minimal angemeldetes Einfügen statt eines vollständig protokollierten Updates durchführen.

Nicht nur ist die Aktualisierung der Tatsache Tabelle eine schlechte Idee in der Theorie, wird es sehr teuer und nicht skalierbar wie die Tatsache Tabelle wächst. Sie werden lesen und schreiben mehr data, die mehr IOPS aus dem memory subsytem. Wenn Sie sich bereit machen, Analytics zu machen, wird die Würfelverarbeitung dann mehr Probleme auslösen.

Du musst auch immer das Management rechtfertigen, warum du so viele IOPS für das Data Warehouse brauchst. Gibt es Geschäftswert / Rechtfertigung in der Notwendigkeit, alle diese IOPS für Ihre ständig wechselnden "Tatsache" Tisch?

Wenn Sie einen path nicht um Updates auf der Faktentabelle finden können, legen Sie zumindest einen Cut-off-Punkt fest, an dem die data schreibgeschützt sind. Ansonsten kannst du niemals skalieren

Umschalten hilft hier nicht.

Vielleicht können Sie Updates gleichzeitig mit mehreren Threads auf verschiedenen Reihen von Zeilen ausführen. Das könnte es beschleunigen. Sei vorsichtig, keine Sperren-Eskalation auszulösen, damit du eine gute Parallelität bekommst.

Stellen Sie außerdem sicher, dass Sie die Zeilen meist in aufsteigender Sortierreihenfolge des gruppierten Indexes aktualisieren. Dies hilft bei der Festplatte IO (diese Technik funktioniert nicht gut mit Multi-Threading).