Ein­lei­tung

Die Kon­so­li­die­rung, Siche­rung und Bereit­stel­lung von auf­ge­ar­bei­te­ten Quell­da­ten ist ein zen­tra­ler Aspekt zur Aus­wer­tung und Berech­nung wich­ti­ger Kenn­zah­len einer Sta­tis­tik-Daten­bank. Synvert konnte ein bedeu­ten­des Pro­jekt bei einem lang­jäh­ri­gen Kun­den abschlie­ßen, bei dem die wich­tigs­ten sta­tis­ti­schen Kenn­zah­len durch grund­le­gend neu kon­zi­pierte und opti­mierte Füh­rungs­kenn­zah­len abge­löst wurden.

Für die Opti­mie­rung der Kenn­zah­len wurde in einem umfang­rei­chen Ent­wick­lungs­pro­zess eine rück­wir­kende Ver­sio­nie­rung auf­ge­baut. Diese basiert auf spe­zi­fi­sche Bewe­gungs- und Per­so­nen­stamm­da­ten aus einem ver­sio­nier­ten Core Data Ware­house und einem nicht direkt ver­knüpf­ba­ren tages­ak­tu­el­len Datamart. Mit zahl­rei­chen SQL-Skrip­ten und ‑Funk­tio­nen konnte eine Ver­bes­se­rung der Daten­qua­li­tät, die Kor­rek­tur feh­ler­haf­ter Daten­er­fas­sung und eine Opti­mie­rung der Per­for­mance der Daten­ver­ar­bei­tung erzielt werden. 

In die­sem Blog­bei­trag wer­den die Her­aus­for­de­run­gen und Ziele sowie die Umset­zung mit SQL näher beleuchtet.

Her­aus­for­de­run­gen und Ziele

Die zugrun­de­lie­gende Sta­tis­tik-Daten­bank ist das zen­trale Ele­ment für die Ana­lyse und Aus­wer­tung von Daten, die aus ver­schie­de­nen Quell­sys­te­men stam­men. Täg­lich wer­den große Daten­men­gen gelie­fert, die anschlie­ßend ver­ar­bei­tet, auf­be­rei­tet und für das BI-Report­ing zur Ver­fü­gung gestellt wer­den. Aus dem Quell­sys­tem wer­den per­so­nen­be­zo­gene Daten kon­so­li­diert, wel­che die ver­sio­nier­ten Stamm­da­ten bilden.

Ist-Zustand

Bedingt durch feh­ler­hafte manu­elle Ein­ga­ben in der Quelle kön­nen für eine Per­son meh­rer Vor­gänge V1, V2, …, Vn exis­tie­ren, die wie­derum an Maß­nah­men Mi geknüpft sind. Für einen Vor­gang Vi einer Per­son exis­tiert jeweils eine Ver­sio­nie­rung im Core. Jeder Vor­gang Vi wird durch ein Start­da­tum fest­ge­legt und kann durch ein End­da­tum abge­schlos­sen wer­den. Im Quell­sys­tem ist es mög­lich, die­ses Start- und End­da­tum rück­wir­kend zu ver­än­dern, wodurch sich die Vor­gänge V1, V2, …, Vn zeit­lich über­lap­pen oder par­al­lel lau­fen kön­nen. Die Maß­nah­men M1, M2, …, Mn haben eben­falls eine zeit­li­che Gül­tig­keit wie einen Stich­tag, an dem eine Maß­nahme Mi durch­ge­führt wird (Abbil­dung 1).  
Für die Berech­nung der Kenn­zah­len ist es zwin­gend erfor­der­lich, die Vor­gänge einer Per­son zu einem Vor­gang Z zusam­men­zu­fas­sen, um die Kenn­zah­len nicht zu ver­fäl­schen oder ver­zer­ren, da sonst mög­li­cher­weise meh­rere Vor­gänge einer Per­son mit­ein­flie­ßen würden.

Zusammenhang der Vorgänge für die initiale Datenversionierung
Abbil­dung 1: Zusam­men­hang zwi­schen Vor­gän­gen Vi und einem Vor­gang Z mit den dazu­ge­hö­ri­gen Maß­nah­men Mi. Gepunk­tete Linien zei­gen den Beginn des Leads eines jeden Vor­gangs Vi im Vor­gang Z dar.

Im Datamart exis­tierte bereits vor dem Pro­jekt ein Ver­fah­ren mit umfang­rei­cher Logik und Ver­ar­bei­tungs­pro­zes­sen in Infor­ma­tica Power­Cen­ter, um die mit einer Per­son ver­knüpf­ten Vor­gänge zu einem Vor­gang Z zusam­men­zu­fas­sen. Ins­be­son­dere das Start­da­tum spielt eine ent­schei­dende Rolle, wel­cher Vor­gang Vi den Lead für den Vor­gang Z über­nimmt. Obwohl diese Infor­ma­tio­nen auf tages­ak­tu­el­ler Basis vor­lie­gen, kön­nen sie aber zeit­lich nicht so auf­ge­löst wer­den, um den Lead-Vor­gang abzu­bil­den. Zudem wird bis heute auf die Ver­knüp­fung zwi­schen Vi und Z mit einem Fremd­schlüs­sel ver­zich­tet, obwohl Vi und Z jeweils durch ein­deu­tige Schlüs­sel fest­ge­legt werden.

Soll-Zustand

Es lässt sich zum heu­ti­gen Stand nicht ohne Wei­te­res iden­ti­fi­zie­ren, wel­cher Vor­gang Vi und zuge­hö­rige Maß­nah­men Mi zu einem Vor­gang Z gehö­ren. Für die Opti­mie­rung der Kenn­zah­len ist es von ent­schei­den­der Bedeu­tung, zu einem bestimm­ten Zeit­punkt den rich­ti­gen Vor­gang Vi zu iden­ti­fi­zie­ren und die zuge­hö­ri­gen Infor­ma­tio­nen aus der Ver­sio­nie­rung des Vor­gangs Vi zu erhal­ten. Dar­über hin­aus muss für eine Maß­nahme Mi gewähr­leis­tet sein, dass diese dem rich­ti­gen Vor­gang Z zuge­ord­net wird. In Folge des­sen ist der Auf­bau einer Ver­sio­nie­rung im Datamart wün­schens­wert, wel­che die ver­sio­nier­ten Stamm­da­ten aus dem Core mit den Bewe­gungs­da­ten aus dem Datamart verknüpft.

Bei der Umset­zung gilt es, fol­gende Her­aus­for­de­run­gen zu bewältigen:

Feh­ler­hafte manu­elle Ein­ga­ben und Datenkonsistenz

Das Pro­blem der zu einer Per­son exis­tie­ren­den, zeit­lich über­schnei­den­den oder par­al­lel­lau­fen­den Vor­gänge ist zurück­zu­füh­ren auf die feh­ler­hafte oder zu Tei­len unvoll­stän­dige manu­elle Erfas­sung im Quell­sys­tem. Diese beein­träch­tigt nicht nur den Auf­bau der Ver­sio­nie­rung, son­dern auch die Qua­li­tät der neuen Kenn­zah­len. Hier­für müs­sen ins­be­son­dere auf­wän­dige Berei­ni­gun­gen erfolgen. 

Eine wei­tere Her­aus­for­de­rung ist die Sicher­stel­lung der Daten­kon­sis­tenz. Es ist ent­schei­dend, dass die neuen Kenn­zah­len kor­rekt berech­net und struk­tu­relle Inkon­sis­ten­zen ver­mie­den wer­den. Außer­dem darf bei der Inte­gra­tion in die Daten­bank die Inte­gri­tät der bestehen­den Daten nicht gefähr­det wer­den. Hier­für wer­den umfas­sende Test­pläne ent­wi­ckelt und Vali­die­run­gen durch­ge­führt, um die Kor­rekt­heit sowie Kon­sis­tenz der neuen Kenn­zah­len sicherzustellen.

Auf­bau der Ver­si­ons­his­to­rie und täg­li­che Bewirtschaftung

Es muss ein Ver­fah­ren ent­wi­ckelt wer­den, um die zu einem Vor­gang Z gehö­ren­den Vor­gänge Vi und Maß­nah­men Mi zuord­nen zu kön­nen. Dies wird von spe­zi­el­len SQL-Skrip­ten erzielt, die unter ande­rem im nach­fol­gen­den Abschnitt genauer erläu­tert wer­den. Neben der initia­len Bela­dung der Ver­sio­nie­rung im Datamart muss eben­falls sicher­ge­stellt wer­den, dass die täg­li­che Bewirt­schaf­tung der neuen Ver­si­ons­ta­belle gewähr­leis­tet ist. Hier­für soll ein Map­ping in Infor­ma­tica Power­Cen­ter ent­wi­ckelt wer­den, wel­ches die täg­li­che Ver­sio­nie­rung der Daten vornimmt.

Per­for­mance-Eng­pässe

Die Kenn­zah­len und die neue Ver­sio­nie­rung darf die Per­for­mance des täg­li­chen Betriebs nicht beein­träch­ti­gen. In einem PoP wurde zunächst ent­lang des Arti­kels Per­for­mante Dublet­ten­ent­fer­nung mit Infor­ma­tica Power­Cen­ter die initiale Ver­sio­nie­rung geprüft. Die Berech­nung pro Minute von weni­ger als 10 der ins­ge­samt 26 Mil­lio­nen Daten­sätze zeigte sich als nicht per­for­mant. Mit den deut­lich grö­ße­ren Leis­tungs­re­ser­ven von 320 CPUs (im Ver­gleich zu den auf dem ETL-Ser­ver bereit­ste­hen­den 16 CPUs) und der par­al­le­li­sier­ten Ver­ar­bei­tung der indi­zier­ten Daten boten die SQL-basier­ten Skripte eine ver­meint­lich bes­sere Alter­na­tive. Die Ver­la­ge­rung von Berech­nun­gen und Daten­ver­ar­bei­tungs­pro­zes­sen von Infor­ma­tica Power­Cen­ter auf den vor­han­de­nen VMware Green­plum® Daten­bank­clus­ter stellt eine tech­ni­sche Her­aus­for­de­rung dar. 

Umset­zung

Auf­grund der oben erwähn­ten Res­sour­cen spiel­ten SQL-Skripte die zen­trale Rolle bei dem Auf­bau der Dimen­si­ons­his­to­rie. Im Ent­wick­lungs­pro­zess haben sich dabei die nach­fol­gen­den Pro­zess­schritte hervorgetan.

Siche­rung der Datenqualität

Ein­gangs wurde bereits auf den hohen Anspruch der Sta­tis­tik an die Daten­qua­li­tät hin­ge­wie­sen. Eine zuver­läs­sige Metrik erfor­dert daher eine solide Daten­ba­sis. Um die­ses Ziel zu errei­chen, müs­sen Red­un­dan­zen und struk­tu­relle Inkon­sis­ten­zen auf­ge­deckt und betrof­fene Daten­sätze ent­fernt wer­den.
Für den Kun­den war es daher von beson­de­rer Bedeu­tung, zunächst alle not­wen­di­gen Regeln und Anfor­de­run­gen an die vor­han­de­nen und auch zukünf­ti­gen Daten aus einem his­to­risch gewach­se­nen Data Ware­house zu iso­lie­ren und gege­be­nen­falls neu zu defi­nie­ren.
Die­ser Vor­gang war und ist dahin­ge­hend so ent­schei­dend, um in den dar­auf­fol­gen­den Kor­rek­tu­ren der Inkon­sis­ten­zen auf eine manu­elle Über­prü­fung ver­zich­tet zu können.

Der Fin­dungs­pro­zess

Self-joins, geknüpft an sinn­volle join-Bedin­gun­gen sind ein effek­ti­ves Mit­tel, um Red­un­dan­zen zu iden­ti­fi­zie­ren. Zumal in die­sem use case mehr als vier ver­schie­dene Sze­na­rien mög­lich waren, die einen Daten­satz als ungül­tig qua­li­fi­zie­ren konn­ten. Win­dow func­tions wären hier eben­falls denk­bar und erzie­len unter Umstän­den eine effi­zi­en­tere Ver­ar­bei­tung der Daten und sol­len daher an die­ser Stelle erwähnt werden.

Ange­sichts der Les- und Nach­voll­zieh­bar­keit der Pro­zess­schritte wurde sich jedoch für eine self-join-Logik ent­schie­den.
Dazu wurde die Quell­ta­belle mit Infor­ma­tio­nen aus vali­dier­ten Bewe­gungs­da­ten ange­rei­chert und mit sich selbst ver­bun­den (siehe Abbil­dung 2). Die dar­aus ent­stan­dene Schnitt­menge wurde genutzt, um eine ver­schlankte, geprüfte Daten­ba­sis zu kreieren.

Self-join mit SQL
Abbil­dung 2: Sche­ma­tik der Self-join Logik.

Die Ver­knüp­fung von Core und Datamart

Der betrach­tete Datamart fun­gierte bis dato als Daten­ba­sis für tages­ak­tu­elle Aus­wer­tun­gen von fach­lich sinn­vol­len, nicht abge­schlos­se­nen Vor­gän­gen. Daher sieht das dazu­ge­hö­rige Regel­werk der Ver­ar­bei­tungs­lo­gik eine rück­wir­kende Ände­rung abge­schlos­se­ner, ungül­ti­ger oder gelösch­ter Vor­gänge nicht vor. Die feh­lende Ver­bin­dung ins Core durch einen Anker- oder ein­deu­ti­gen Fremd­schlüs­sel ist des­halb nicht unbe­dingt ver­wun­der­lich, birgt wie in die­sem Anwen­dungs­fall anschau­lich zu erken­nen aber das Risiko diver­gie­ren­der Daten.
Um den­noch eine Ver­bin­dung zwi­schen Datamart und Core her­zu­stel­len, wur­den die Start- sowie End­zeit­punkte eines Vor­gangs Z einer Per­son genutzt, um mög­li­che Über­ein­stim­mun­gen auf den ver­sio­nier­ten Core-Tabel­len zu fin­den (siehe Abbil­dung 3 Markierung).

Datenvalidierung im Core
Abbil­dung 3: Sche­ma­ti­sche Dar­stel­lung der pro­zes­sier­ten Dimen­si­ons­ta­belle mit Daten­va­li­die­rung im Core. Vor­gänge sind mir Pri­mär­schlüs­seln PK_Z im Datamart und PK_V im Core ver­se­hen. Die dazu­ge­hö­ri­gen per­so­nen­be­zo­ge­nen Daten sind mit Fremd­schlüs­seln ver­bun­den. In der Mitte sind vier ver­schie­dene Sze­na­rien dar­ge­stellt, die sich auf mög­li­che ungül­tige Daten­sätze bezie­hen. Start- und End­zeit­punkt, sche­ma­tisch mit Start und Ende dar­ge­stellt, beschrei­ben den Zeit­punkt der Eröff­nung eines Vor­gangs respek­tive den Abschluss des­sen. Ungül­tig mar­kiert fach­lich- oder tech­nisch-gese­hen nicht mehr gül­tige Datensätze.

Dabei kann, wie Ein­gangs beschrie­ben, ein Vor­gang Z meh­rere Vor­gänge V zeit­lich über­span­nen und zusam­men­fas­sen. Die maxi­ma­len äuße­ren Gren­zen blei­ben dabei aber bestehen, sodass eine Zuord­nung wie­der mög­lich ist.
Bei der Erken­nung von Daten­in­kon­sis­ten­zen oder Dublet­ten durch den join, wer­den die in der Abbil­dung 3 gezeig­ten Regeln ange­wandt. Der Daten­satz wird auf den tages­ak­tu­el­len Stand gebracht, als ungül­tig mar­kiert oder gar gelöscht. Die­ser Schritt wirkt harsch, jedoch kann nach den ange­wand­ten Regeln nur ein ein­zi­ger Vor­gang Z einer Per­son zu einem bestimm­ten Zeit­punkt exis­tie­ren. Zeit­li­che Über­schnei­dun­gen in den Vor­gän­gen Z würde im Auf­bau einer Ver­si­ons­his­to­rie zu einer uner­wünsch­ten Ver­viel­fäl­ti­gung von Daten­sät­zen führen.

Die Ver­sio­nie­rung

Für die Ent­wick­lung einer initia­len Daten­his­to­rie wer­den die berei­nig­ten täg­li­chen Daten erneut über die ver­sio­nier­ten Core-Daten geschickt, über die bestehende His­to­rie ver­viel­fäl­tigt (siehe Abbil­dung 4 Links) und auf tem­po­räre Tabel­len aus­ge­la­gert. Als zeit­li­che Gren­zen die­nen dabei die Start- und sofern vor­han­den die End­zeit­punkte eines Vor­gangs Z. Gezielte sel­ect-State­ments und umfas­sende join-Bedin­gun­gen schrän­ken dabei die abge­frag­ten Infor­ma­tio­nen der Bewe­gungs­da­ten auf das Wesent­li­che ein und sor­gen für einen schlan­ken Datenfluss.

Ablauf der initialen Datenversionierung
Abbil­dung 4: Sche­ma­ti­scher Ablauf der initia­len Ver­si­ons­be­wirt­schaf­tung. Aus­ge­hend der berei­nig­ten täg­li­chen Dimen­si­ons­ta­belle wer­den die Daten­sätze über ver­sio­nierte Bewe­gungs­ta­bel­len ent­lang der bestehen­den Ver­si­ons­his­to­rie ver­viel­fäl­tigt. Der Ver­si­ons­ver­lauf der ent­ste­hende ver­sio­nier­ten Dimen­si­ons­ta­belle führt ent­lang der Erfas­sungs­da­ten der ein­zel­nen Bewe­gungs­ab­schnitte der Attri­bute auf der Tabelle.


Der in die­sem Schritt noch nicht­exis­tie­rende ein­deu­tige Ver­si­ons­schlüs­sel wird tem­po­rär durch einen com­po­site key ersetzt. Das ermög­licht natür­lich nicht nur die Iden­ti­fi­zie­rung ein­zel­ner Daten­sätze, son­dern auch die Refe­ren­zie­rung zwi­schen den tem­po­rä­ren Tabel­len. Zudem beschleu­nigt es die par­al­lele Qua­li­täts­si­che­rung und Anrei­che­rung der Ver­si­ons­ta­belle mit Bewe­gungs­da­ten.
Die sich dar­aus zeit­lich noch über­lap­pen­den Daten­ver­sio­nen wer­den im nächs­ten Schritt durch win­dow func­tions einem Ran­king unter­zo­gen und gefil­tert, sodass diese nicht-über­lap­pende Zeit­in­ter­valle erge­ben. Ent­schei­dend für den Abschluss eines Inter­valls ist dabei das Datum der Erfas­sung des dar­auf­fol­gen­den Vor­gangs. Abschlie­ßend wird der gesetzte com­po­site key auf­ge­löst und der Pri­mär­schlüs­sel auf der Tabelle gesetzt. Zudem wird im glei­chen Zug eine täg­lich bewirt­schaf­tete Anker­ta­belle zwi­schen Datamart und Core erstellt.

Per­for­mance-Opti­mie­rung

Mei­len­stein des Pro­jekts war die schnelle Kenn­zah­len­be­rech­nung durch direkte Aus­füh­rung auf dem on-pre­mise Daten­bank­clus­ter. Glück­li­cher­weise lag uns keine „pay-as-you-go“-Restrik­tion vor.
Eine Kom­bi­na­tion aus indi­zier­ten Daten, durch­dacht ein­ge­setz­ten win­dow func­tions und die Aus­la­ge­rung von Berech­nun­gen auf tem­po­räre Tabel­len resul­tie­ren in einer kun­den­freund­li­chen Per­for­mance.
Die Berech­nungs­zeit von meh­re­ren Tagen in Infor­ma­tica Power­Cen­ter wurde auf wenige Minu­ten auf dem Clus­ter redu­ziert. Power­Cen­ter wird aus­schließ­lich für die täg­li­che Delta-Kodie­rung verwendet.

Ins­ge­samt wur­den mehr als 2000 Zei­len SQL-Code benö­tigt, um eine fach­lich kor­rekte initiale Ver­si­ons­his­to­rie auf­zu­bauen. Im Sinne der Modu­la­ri­tät konnte mehr als die Hälfte des Codes für die täg­li­che Ver­ar­bei­tung wei­te­rer täg­lich gela­de­ner Tabel­len in die­sem Datamart wie­der­ver­wen­det wer­den. Dar­aus ergab sich nicht nur ein redu­zier­ter workload der Ent­wick­ler, es konn­ten auch die zeit­li­chen engen Gren­zen der Batch­ver­ar­bei­tung des Kun­den ein­ge­hal­ten werden.

Resü­mee

Die Neu­kon­zi­pie­rung wich­tigs­ter Füh­rungs­kenn­zah­len der vor­lie­gen­den Sta­tis­tik-Daten­bank und die Ent­wick­lung einer rück­wir­ken­den Daten­his­to­rie ohne Ver­lust der Inte­gri­tät war ein kom­ple­xes und her­aus­for­dern­des Pro­jekt. In die­sem use case konnte durch den Ein­satz von SQL-Skrip­ten die Daten­qua­li­tät enorm ver­bes­sert, inkon­sis­tente manu­elle Nut­zer­ein­ga­ben kor­ri­giert und die Per­for­mance der Ver­ar­bei­tungs­stre­cke opti­miert wer­den. Die Ent­wick­lung der Ver­sio­nie­rung im Datamart ver­bes­serte zudem die Trans­pa­renz und Nach­voll­zieh­bar­keit der Daten erheblich.

Die ver­sio­nierte Dimen­sion wird in Zukunft auch noch für neue Kenn­zah­len rele­vant und von Nut­zen sein. Dem Kun­den wird die Mög­lich­keit gebo­ten, prä­zi­sere und infor­ma­ti­ons­rei­chere Ana­ly­sen und Berichte, die auf ver­läss­li­chen Daten basie­ren, durch­zu­füh­ren. Die Ergeb­nisse die­ses Pro­jekts sind beein­dru­ckend und zei­gen die Wich­tig­keit in die Qua­li­tät und Per­for­mance von Daten­ban­ken zu inves­tie­ren.
Die Erfolge die­ses Pro­jekts sind ein Beweis dafür, dass inno­va­tive Lösun­gen zur Ver­bes­se­rung von Daten­ban­ken im lau­fen­den Betrieb mög­lich sind.