Dani Schnider hat vor einigen Wochen einen schönen Artikel veröffentlicht, in dem er verschiedene Möglichkeiten zur Bestimmung von Datenänderungen zwischen Quellsystem und Data Warehouse erläutert. Grundsätzlich kann in solchen Fällen ein Full (oder Left) Outer Join verwendet werden, der die Daten aus Quelle und Ziel miteinander abgleicht, und dabei gibt es drei relevante Fälle:
- ein Datensatz existiert nur in der Quelle und nicht im Ziel: demnach wurde er neu erzeugt und muss im Ziel ergänzt werden.
- ein Datensatz existiert nur im Ziel, nicht aber in der Quelle: offenbar wurde er in der Quelle gelöscht. In der Regel wird er nicht aus der Zieltabelle gelöscht, sondern dort als "im Quellsystem gelöscht" markiert (in der Regel mit Zeitstempel).
- ein Datensatz existiert in Quelle und Ziel, aber einige Attribute weichen ab. In diesem Fall können unterschiedliche Versionierungsstrategien verwendet werden.
Der angesprochene Full (Left) Outer Join wäre recht trivial, wenn es nicht Fälle gäbe, in denen einzelne Attribute NULL-Werte enthalten können. Für diese Fälle gibt es folgende Abgleichs-Möglichkeiten:
- NVL: man ersetzt NULL-Werte durch einen Wert, der in den Daten nicht erscheinen kann - wobei auf den Datentyp zu achten ist. Die Definition entsprechender Default-Werte kann relativ mühsam sein.
- LNNVL: ist Datentypunabhängig, hat aber den Nachteil, dass der Vergleich true liefert, wenn beide Werte NULL enthalten. Daher ist das für diesen Fall erzeugte Statement relativ unübersichtlich.
- SYS_OP_MAP_NONNULL: eine interne Funktion, die NULL durch einen internen Platzhalter ersetzt. Dadurch wird die Vergleichsquery recht übersichtlich, aber leider ist die interne Funktion noch immer nicht offiziell dokumentiert.
- DECODE: liefert 1, wenn die Vergleichswerte identisch sind oder beide NULL, sonst aber 1. Durch Aufsummieren der Vergleichsergebnisse kann man erkennen, ob es relevante Abweichungen gibt.
- ORA_HASH: kann aus der konkatenierten Spaltenliste einen Hash-Wert generieren. Probleme kann die Länge der verknüpften Strings mit sich bringen und theoretisch gibt es die Möglichkeit von Hash-Kollisionen.
Keine Kommentare:
Kommentar veröffentlichen