Wie geziehlt Datenblöcke erstellen.

In einer Block-Storage Datenbank werden die Daten in sogenannte Datenblöcke gespeichert. Eine Standardfunktion und eine Art Sicherheitsmechanismus ist, dass Essbase in einer Berechnung nur in spezielle Fälle neue Datenblöcke erstellt. Es kommt immer wieder vor, dass eine Berechnung kein Ergebnis erzeugt. Der Grund ist oft, dass es keinen Datenblock gibt um das Ergebnis zu speichern. Daher ist es für den Entwickler oft eine Herausforderung, um die Datenblöcke vorher anzulegen oder Sorge zu tragen, dass Essbase immer die notwendigen Datenblöcke erstellt. In diesem Beitrag beschreibe ich verschiedene Methoden mit denen geziehlt Datenblöcke angelegt werden können.

Ein kurzer Ausflug in die Theorie von Datenblöcken.

Ein Datenblock besteht aus gespeicherte Elemente aller Dense Dimensionen. Jeder Datenblock in einer bestimmten Anwendung hat dieselbe Struktur, z.B. ein Raster aus allen Kennzahlen und Monate. Wenn eine einzige Zahl in eine Datenbank hochgeladen wird, erstellt Essbase einen Datenblock. Zudem wird in einem Index gespeichert, für welchen Schnittpunkt der Sparse Dimensionen diese Zahl hochgeladen wurde: z.B. für Florida und das Produkt Orangensaft.

Bei einer Aggregation der Daten entstehen dann viele Datenblöcke für die Hierarchie-Elemente der Sparse Dimensionen.

Dense / Sparse Dimensionen

Abbilung 1: Die Data Storage settings der Beispielanwendung.

Wegen der Komplexität gehe ich mit meiner Erklärung noch einen Schritt weiter und verwende dafür die Beispiel-Anwendung Sample Basic. Diese Anwendung hat die Dimensionsstruktur wie in Abbildung 1 gezeigt wird. Der Datenblock wird durch die Dense Dimensionen Years, Measures und Scenario gebildet. Ein Datenblock kann nur für die Kombination von jeweils einem Product und einem Market existieren. Dieses sind die Sparse Dimensionen.

Excel mit beschreibbare und schreibgeschuetzte Zellen.

Abbildung 2: Excel mit markierte Level0 Kombinationen.

In der Abbildung 2 habe ich in Excel die Struktur von einem Block in der Sample.Basic Datenbank erstellt. Die grünen Zellen sind die gespeicherten Elemente der Dense Dimensionen, und hier kann ein Datenload oder eine Eingabe stattfinden. Die grau markierten Zellen sind entweder Eltern Elemente oder haben Formeln. Diese werden berechnet, wenn der Block von der Festplatte in den Speicher geladen wird.

Sparse Dimensionen aufgerissen.

Abbildung 3: Die Sparse Dimensionen der Beispielanwendung.

Ein Aufriss von den Sparse-Dimensionen wird in der Abbildung 3 gezeigt. In dem weiteren Verlauf des Beitrags werde ich hiermit die Beispiele erstellen.

Es ist also wichtig, das Datenmodell zu kennen!

Das Problem näher beschrieben.

Wie am Anfang schon beschrieben, erstellt Essbase nicht in allen Fällen den benötigten Datenblock. In den meisten Fällen schon, wie beim Laden von Daten mit SmartView oder per Laderegel, dort gibt es kein Problem. Auch bei der Aggregation der Daten werden die Datenblöcke erstellt. Auch der DATACOPY Befehl in einer Berechnungen wird die benötigten Blöcke ohne Probleme erstellen. Doch das Problem kann auftreten bei der Verwendung einer Gleichung in einer Business Rule oder Calc Script.  

In der Abbildung 4 sehen wir ein Beispiel, wo wir die Sales Daten von Texas und Grape in Florida Orange kopieren wollen. In diesem Fall werden keine Datenblöcke erzeugt.

Skript mit 2 Zeilen

Abbildung 4: In diesem Skript werden keine Datenblöcke erzeugt.

Wenn wir aber die Formel umschreiben, wie in Abbildung 5, dann werden Datenblöcke erzeugt. Was ist den Unterschied? In dem zweiten Fall steht ein Element einer Sparse Dimension links von der Gleichung. Wie oben beschrieben, wird ein Element einer Dense Dimension in alle möglichen Datenblöcke einer Datenbank verwendet. Eine Gleichung ohne FIX würde dann alle möglichen Datenblöcke einer Datenbank erstellen, und schon bei kleine Datenmodelle sind das bestimmt mehr GB an Daten als die Festplatte fassen kann. Deshalb gibt es diese “Sicherung”.

Skript mit sparse dim links.

Abbildung 5: Das Dense Member ist in den FIX, hiermit werden Datenblöcker erzeugt.

SET CREATENONMISSINGBLK und SET CREATEBLOCKONEQ

Es gibt natürlich auch Wege, um diesen Sicherheitsmechanismus abzuschalten und Essbase die Datenblöcke erstellen zu lassen. Dieses wird erreicht mit den Settings SET CREATENONMISSINGBLK und SET CREATEBLOCKONEQ. Ein großer Nachteil ist, dass der Einsatz von diesen Settings oft in viel extra Rechenzeit endet und deshalb sollten diese bedachtsam eingesetzt werden.

Mit SET CREATENONMISSINGBLK ON schaut Essbase während der Berechnung im Speicher nach, ob ein Block überhaupt einen Datenwert enthalten würde. Wenn dem so ist, dann wird dieser Datenblock erstellt, sonst nicht. Dieses erzeugt also keine leere Datenblöcke, und das ist ein sehr großer Vorteil. Die Setting funktioniert sowohl in einer Formel mit einem Dense oder Sparse Element. Diese Funktion sollte nur mit einem begrenzten FIX – ENDFIX eingesetzt werden, denn potentiell entstehen viele Daten, die nicht unbedingt gewollt sind. Dieses Setting schaltet auch die SET CREATEBLOCKONEQ ab.

Das Setting SET CREATEBLOCKONEQ ON erzeugt Datenblöcke, und zwar viele! Hierbei wird nicht geschaut, ob diese Daten enthalten oder nicht. Nur wenn man eine Konstante einsetzt, z.B. “Florida” = 100; werden keine Böcke erstellt, ansonsten aber wohl. Es sind also sehr spezielle Fälle, wo diese Setting zum Einsatz kommt.

Die CREATEBLOCK Funktion

@CREATEBLOCK? den kenne ich noch garnicht. Ja, das kann sehr gut sein, denn diese Funktion kam erst in der Version 11.1.2.3. uns zur Verfügung. Die Anwendung ist sehr einfach, denn mit der Funktion muss nur ein Membername oder eine Liste mit Membernamen angegeben werden. Hierunter werden auch Memberkombinationen mit dem CrossDimensionalOperator und Funktionen die eine Liste von Elemente ausgeben wie z.B. @IDESCENDANTS verstanden. Mann sollte hier ein Element oder Elemente einer Sparse Dimension wählen und dann erfolgt die Berechnung im Top-down Modus.

@CREATEBLOCK(mbrName|mbrList)

Damit nicht zuviele Blöcke erzeugt werden, sollte auch diese Funktion unbedingt mit FIX auf den benötigten Bereich eingestellt werden. Das Erzeugen der Blöcke geht superschnell, doch wenn dann die Aggregation kommt, dann kann es zu kitische Größen kommen.

In dem Block werden alle Zellen auf #missing gesetzt und damit wird ein leerer Block erstellt. Aber keine Sorge, wenn der Block schon existiert, dann werden die Daten nicht angerührt, denn die Funktion erstellt nur Blöcke, die es noch nicht gibt. Danach kann die Berechnung erfolgen, für welche diese Blöcke angelegt wurden. Nach Abschluss wäre es eine gute Sache, um die nicht benötigten Datenblöcke mit dem Kommando CLEARBLOCK EMPTY wieder zu entfernen. Hiermit bleiben keine unnötige Altlasten in der Datenbank zurück.

DATACOPY

Bewährt und oft eingesetzt wird auch der DATACOPY Befehl. Weil diese auf den Index schaut, ist diese Methode auch sehr schnell. Wenn der kopierte Bereich anhand der Werte aus dem Quell-Bereich Berechnet wird, dann hat man immer einen Datenblock und auch keine zuviel. Vorallem bei Allokationen, wo ich den Treiber mit DATACOPY in den Rechenbereich kopiere, funktioniert ganz gut.

Fazit

Gute Calc Skripte schreiben ist nicht einfach, aber es ist einfach, damit zu beginnen. Es gibt vieles zu beachten und der Datenblock ist eines davon. Ich hoffe dieser Beitrag bringt ein wenig Licht in die Katakomben der Essbase Rechnenmaschine.

Ihr Philip Hulsebosch

Veröffentlicht unter Essbase Getagged mit: , , , , , ,