Die SYNAXON AG benutzt ein seit Jahren ein Data Warehouse, um Auswertungen zu den Geschäftsdaten zu erhalten.
Aktuell migrieren wir unser DW auf eine neue Version auf Basis des MS SQL 2008R2. Dabei werden die ETL Pakete auf das neue dtsx Format umgestellt. Die SQL Queries werden dabei teilweise an die neuen Möglichkeiten angepasst. Die primäre Business Datenbank ist weiterhin eine Oracle 11g. Zwei SQL Dialekte also, die leider nicht immer die gleichen Ergebnisse liefern.
Beim nächtlichen Befüllen der Data Warehouse Tabellen wird dabei für große Tabellen aus Performancegründen nicht immer der komplette Datenbestand kopiert, sondern nur die Daten der letzten zwei Monate (am Wochenende erfolgt jeweils ein Vollimport). Dabei werden in der MS SQL Datenbank zunächst die Daten der letzten zwei Monate gelöscht und dann die Daten der letzten zwei Monate aus der Oracle Datenbank importiert.
Bei der Überprüfung der Cubes im neuen DW fielen mir heute Abweichungen zum alten DW auf, die ich mir zunächst nicht erklären konnte. Eine genauere Analyse zeigte, dass der Unterschied in den verschiedenen Interpretationen der Datumsfunktionen begründet war.
Vereinfacht dargestellt, liefert select dateadd( mm, -2, ‚28.02.2013‘ ) bei MS SQL als Resultat den 28.12.2012, das Pendant bei Oracle select add_months( ‚28.02.2013‘, -2 ) from dual aber den 31.12.2012. Oracle liefert beim Addieren/Subtrahieren von Monaten also den Ultimo, wenn das Quelldatum ebenfalls der Ultimo war. MS SQL hat diese Funktionalität nicht implementiert.
Für das neue DW hatte dies nun die Folge, dass die Daten ab dem 28.12.2012 gelöscht wurden (MS), allerdings nur die Daten ab dem 31.12.2012 neu geladen wurden (Oracle). Somit fehlten die Daten des 28., 29. und 30.12 im neuen DW und dies begründete die unterschiedlichen Werte. Kleiner Unterschied – große Wirkung. Ich lade die Daten jetzt nicht mehr für die letzten zwei Monate, sondern für die letzten 60 Tage. Da verhalten sich beide System gleich ;-)
Schreiben Sie einen Kommentar