25 | 06 | 2019

Measures oder Measure Dimension

Beim letzten Projekt hat mich ein Kollege gefragt wie wir die Deckungsbeitragsrechnung darstellen. Es handelte sich dabei um eine operative Steuerung - eine Deckungsbeitragsrechnung mit mehreren Stufen suggeriert bei machen automatisch eine Account Dimension und nur eine Kennzahle - den Wert, wobei wir die Werte relational durchaus als Spalten der Faktentabelle berechnet haben. Generell taucht diese Fragestellung immer im Zusammenhang mit Finanzapplikationen auf.

Darauf habe ich mir kurz die Vorteile / Nachteile überlegt.

  • Wenn man sich die Objektstruktur von Analysis Services Ansieht kann man darauf schließen, das Analysis Services intern ähnlich speichert wie er das ideale Starschema geleifert haben will. Dies spricht eindeutig für Kennzahlen.
  • Mit einer Account Dimension kann man eine Struktur - einen logischen Navigationspfad - abbilden. Kennzahlen sind aus AS Sicht immer eine flache Liste.
  • Unterschiedliche Kennzahlen können unterschiedliche Datentypen habe - eine Kennzahl kann nur einen Datentyp haben. Dadurch muss man automatisch den größten gemeinsamen Datentyp - in aller Regel Double oder Money - wählen.
  • Wenn man logisch überlegt - eine weitere Dimension bedeutet auch eine weitere Referenz auf eine andere Dimension.
  • Analysis Services ließt bei einer Abfrage immer alle Kennzahlen der Measuregroup für die gewählten Dimensionen. Dies kann ein Vorteil oder Nachteil sein. Ebenso wird eine tabellarische Struktur für den Cache verwendet.

Um dies zu verifizieren habe ich eine kleine Beispieldatenbank gemacht.

  • Drei Dimensionen mit je 100 Elementen
  • Eine Faktentabelle mit allen Kombinationen ==> 1.000.000 Zeilen
  • mit 10 Kennzahlen unterschiedlicher Datentypen (int, bigint, money, float).

mit diesem Star Schema habe ich dann zwei Analysis Services Datenbanken erstellt die sich lediglich um eine Kennzahlendimension oder Kennzahlen unterscheiden.

  • von den relational 10 Kennzahlen habe ich nur 8 verwendet und alle mit dem gleichen Datentyp Currency, damit ich keine Unterschiede im Speicherplatz durch die Datentypen habe.
  • für die Measuredimension habe ich eine Named Query mit 1 bis 8 als Key erzeugt und M1 ... MX als Namen.
  • für die Faktentabelle habe ich eine Named Query mit einem union all der 8 Kennzahlen und konstanten Eintragungen für die Measuredimension gemacht.

Das Ergebnis

  Measures Measures als Dimension
Datenbankgröße als Backup 29.782.016 bytes 48.291.840 bytes
Partitionsdatendatei Größe 29.475.790 bytes 47.597.646 bytes

Auch unterschieden sich die Abfragen entsprechend

  Measures Measures als Dimension
Abfrage select {[Measures].[M1],[Measures].[M4],[Measures].[M9]} on columns, {[Dim1].[Id].AllMembers} on rows from [Cube] select {[Dim4].[Id].&[1],[Dim4].[Id].&[4],[Dim4].[Id].&[9]} on columns, {[Dim1].[Id].AllMembers} on rows from [Cube]
Laufzeit kalter Cache 159ms 201ms

Alleine Aufgrund der Datenbankgrößenunterschiede muss eine Abfrage mit der Kennzahlendimension länger dauern als eine Abfrage mit den Kennzahlen, da erheblich mehr Daten von der Festplatte gelesen werden müssen.

Daher kann für mich nur folgende Schlussfolgerung gelten - falls nicht unbedingt erforderlich immer Measures zu verwenden.

Nochmal der Hinweise, dass dies kein repräsentativer Vergleich war. Jeder sollte das für seine Situation angepasst Testen.

Testumgebung war

  • SQL Server 2008 Developer Edition RTM
  • Dell Latitude E6400

Um diesen Vergleich selbstständig nachvollziehen zu können sind hier alle Daten zum herunterladen.