Die Arbeit an der Basis einer OLAP-Datenbank erscheint simpel und ist eines der fundamentalen Konzepte. Leider existiert immer wieder Konfusion, was mit Basis (oder den Blättern einer Dimension) gemeint ist.
Hinter diesem Thema stehen zwei unterschiedliche Konzepte, die man beide als Basis bezeichnet:
- Hierarchie-Basis
- MeasureGroup-Basis
In diesem Blogbeitrag werden diese beiden Konzepte betrachtet und Möglichkeiten aufgezeigt, wie man Basisarbeit betreiben kann.
Begriffsdefinitionen
Hierarchie-Basis
Die Basiselemente einer Hierarchie sind die Elemente, die selbst keine sichtbaren Kind-Elemente mehr haben. Ein weiterer Drilldown ist also nicht mehr möglich.
MeasureGroup-Basis
Die MeasureGroup-Basis bezieht sich auf die Faktengranularität, also auf die unterste Ebene, in der die Daten in die Partitionen einer MeasureGroup geladen werden.
Die Kenntnis dieser Basis ist u. a. wichtig für Schreibvorgänge (nur auf die MeasureGroup-Basis kann zurück geschrieben werden – glücklicherweise kümmert sich DeltaMaster beim Planen um dieses Thema) oder auch für Berechnungen (wie zum Beispiel Währungsumrechnungen), die auf der Basisebene ausgeführt und die Ergebnisse danach aggregiert werden müssen.
Auswirkungen
In einfachen Modellen kann die Hierarchie-Basis mit der MeasureGroup-Basis identisch sein, das heißt ein- und dasselbe Element kann Hierarchie- und auch MeasureGroup-Basis sein.
Ein Beispiel:
Betrachten wir die von unserem DeltaMaster Modeler standardmäßig bereitgestellte Periodendimension. Wir können feststellen, dass die Tageselemente in der Periodenhierarchie unsere Hierarchie-Basis sind. Dabei kann es durchaus vorkommen, dass ein Element in einer Hierarchie ein und derselben Dimension einmal Basis ist und einmal nicht – in den beiden Standardperiodenhierarchien des Modeler sind die Tage immer die Hierarchie-Basis.
Je nachdem wie unser Datenmodell aufgebaut ist, werden wir aber auch Daten teils auf Tagen bzw. Monaten und u. U. auch auf Jahren zur Auswertung bereitstellen, wenn ein Kunde zum Beispiel eine langfristige Planung auf Jahresebene wünscht.
Somit können die Jahreselemente in einem Fall MeasureGroup-Basis sein (im Falle der skizzierten Lang-fristplanung) und in einem anderen Fall nicht (im Falle der „normalen“ Ist-Betrachtung auf Ta-gen/Monaten).
Werden alle Nachfolger eines Elements durch Berechtigungen oder Ausblendungen unsichtbar, so wird dieses Element selbst zur Hierarchie-Basis – die MeasureGroup-Basis bleibt davon unberührt.
Wichtig zu wissen ist an dieser Stelle, dass ausgeblendete Elemente in SCOPE Statements so behandelt werden, als wären sie sichtbar!
Hierarchie-Basis
Hierarchie-Basis ermitteln
Die MDX-Funktion, um die Hierarchie-Basiselemente zu ermitteln, lautet:
Descendants(member,,LEAVES)
Will man alle Basiselemente unter dem gerade ausgewählten Element ausweisen, so verwendet man:
Descendants(hierarchie.CurrentMember,,LEAVES)
Manchmal will man auch alle Basiselemente ausweisen, egal welche Auswahl gerade getroffen wurde:
Descendants(hierarchie.Levels(0).Members,,LEAVES)
Achtung: Obwohl diese Form die generellste Form des Aufrufes ist, wird bei Verwendung in einem SCOPE ein Fehler geworfen.
Prüfen auf Hierarchie-Basis
Es gibt viele Wege, ein Element auf Hierarchie-Basis zu überprüfen.
In MDX erfolgt die Prüfung über die Funktion
IsLeaf(member)
Diese Funktion ist implementiert, um die Basiseigenschaft effizient zu ermitteln. Andere Konstrukte wie zum Beispiel member.Children.Count = 0 liefern zwar dasselbe Ergebnis, dieses wird aber mit wesentlich mehr Operationen ermittelt, so dass die Performance leidet.
Die MeasureGroup-Basis
Seit AS2005 ist es möglich, eine spezielle Funktion in MDX zu verwenden, um die MeasureGroup-Basis anzusprechen – die Funktion LEAVES().
- LEAVES()
zeigt auf die Faktgranularität einer MeasureGroup mit allen dort verwendeten Dimensionen - LEAVES(dim)
zeigt auf die Faktgranularität einer MeasureGroup mit nur einer Dimension
Es verdient besondere Beachtung, dass in dieser Funktion eine Dimension verwendet werden kann. In allen anderen Funktionen erwartet MDX die Angabe einer Hierarchie. Da aber die Faktengranularität anhand eines Attributes festgelegt wird, ergibt die Verwendung einer Dimension an dieser Stelle Sinn.
Die Funktion liefert einen Teilwürfel als Abfrageergebnis zurück. Dieser Teilwürfel kann innerhalb eines SCOPE oder auch im linken Teil einer Berechnung im Cubescript verwendet werden:
SCOPE (Leaves(),measures1); this = measure2; END SCOPE; (measure1, Leaves()) = iif(measure2 >0.9, 1, null);
Die Funktion liefert kein Set zurück. Das ergibt auch Sinn, weil Teilwürfel durch Attribute definiert wer-den und Sets durch Hierarchien. Deshalb sollte die Leaves()-Funktion auch nicht in SELECTs oder named Sets verwendet werden.
Um sicher zu gehen, dass Leaves() immer korrekt arbeitet, wird empfohlen im Scope eine Measure für die Berechnung mit anzugeben (vgl. Beispiele oben).