Was ist MDX?
MDX (MultiDimensional eXpressions) ist eine Datenbanksprache für OLAP-Datenbanken und wird als standardisierte Abfragesprache von OLE DB for OLAP (ODBO) und XML for Analysis verwendet. MDX wurde als Erweiterung zu SQL entwickelt, um Abfragen auf OLAP Datenbanken zu ermöglichen. In der Folge fand es schnell eine breite Anwendung im Bereich von analytischen Systemen. Die Sprache wird mittlerweile von vielen OLAP Providern unterstützt. Großer Hersteller (Microsoft, IBM, Oracle) und zahlreiche Tools und OLAP-Frontends unterstützen mittlerweile MDX: SQL Server Analysis Services, SAP BW, Panorama NovaView, Microstrategy, SAS, Cognos-TM1, Hyperion, arcplan usw.
MDX ist sehr komplex und mächtig. In diesem Text wird ein Einblick in die Funktionsweise der multidimensionalen Abfragesprache gegeben. Weiterführende, umfassende Informationen zum Thema MDX und seinen Ursprüngen sind auf der Seite von Mosha Pasumansky zu finden. Er ist einer der führenden Entwickler von MDX und ein ehemaliger Mitarbeiter von Panorama Software.
Sowohl Online Analytical Processing (OLAP) als auch die Programmiersprache Multidimensional Expressions (MDX) ist durch Mitarbeiter von Panorama Software Ltd. hervorgebracht worden. 1996 verkaufte Panorama seine OLAP Technologie an Microsoft, die das Produkt in SQL Server Analysis Services umbenannt und in die SQL Server Plattform integriert hat. Kommerziell wird MDX etwa seit 1998 verwendet, als das erste kommerzielle Programm erschien, dass auf MDX basierte (Vgl.: www.databasejournal.com). MDX wurde von Microsoft unterstützt und etablierte sich als Quasi-Industriestandard. Heute wird MDX als Bestandteil von mdXML weiter entwickelt. mdXML ist wiederum Bestandteil von XMLA (vgl.: xmlforanalysis.com und XMLA in Wikipedia).
Grundlegende MDX-Konzepte
Um MDX und die ihr zugrunde liegende OLAP-Technologie besser verstehen zu können, ist eine genaue Vorstellung von einigen OLAP-Cube-Komponenten wichtig:
Dimensionen
Eine Dimension ist die oberste Kategorie eines Cubes. Dimensionen beinhalten Datenelemente, die eine
Datenmenge in nicht-überlappende Bereiche aufteilen. Diese Datenelemente nennt man Members (Mitglieder).
Eine Dimension kann mehrere Hierarchien haben und in mehreren Cubes verwendet werden. Sehr oft wird die Zeit
als eine Dimension in einem Cube eingerichtet.
Hierarchien
Die Mitglieder einer Dimension können je nach Inhalt in einer oder mehreren Hierarchien angeordnet
werden. Zum Beispiel kann eine Zeitdimension in den Hierarchien Jahr, Quartal, Monat, Woche, Tag kategorisiert
werden. Ein Beispiel für die Zeitdimension wäre 2010, Q2, Mai, 31. Dieser „Ast" des
Hierarchiebaums enthält vier Mitglieder.
Levels
Levels/Ebenen sind Kategorien von Mitgliedern innerhalb einer Dimension. Levels sind hierarchisch aufgebaut.
Jedes Mitglied eines Levels ist automatisch Mitglied des übergeordneten Levels der gleichen Dimension.
So kann zum Beispiel eine Zeit-Dimension die folgenden Levels beinhalten: Jahr, Quartal, Monat, Woche und Tag.
Dabei überlappen sich die Inhalte der Levels nicht. Ein Member kann also auf einer Ebene nur
Mitglied eines Levels sein. So ist der 31. Mai 2010 Mitglied der Jahresebene 2010 und der Quartalsebene 2 und
der Monatsebene Mai und so weiter.
Members
Das grundlegende Element einer Dimension und eines Levels ist ein Member (Mitglied). Ein
Member ist ein Teil von einem Level und teilt die Daten in nicht überlappende
Bereiche auf, z.B. Januar, Februar, ... bis Dezember.
Measures
Measures (Werte) sind die Daten, die man mit den Dimensionen beschreibt. So könnte eine Zelle in
einem einfachen Cube mit Umsatzwerten und mit der einzigen Dimension Zeit so aussehen
(in vereinfachter Notation): 2010 : Q2 : Mai : 31 : Umsatz = 100. Measures sind die unterste Ebene
der Datenelemente in einem OLAP Cube.
Sets
Vorhandene Dimensionselemente können von den Nutzern extrahiert werden. Elemente können aber
auch berechnet und so genannte Sets erstellt werden. Diese basieren auf vorhandenen Members oder kalkulierten
Elementen. Sie werden durch den User definiert und generieren sich aus ausgewerteten Abfragedaten eines Cubes.
MDX Abfrage und Syntax
MDX-Abfragen verwenden die Select-Anweisung zum Extrahieren von Datensätzen, die einen Teil aus mehrdimensionalen Daten beinhalten. Die Select-Anweisung im MDX besteht aus folgenden Befehlen:
[WITH
[MEMBER <Member-Name>
AS
'<Wert-Ausdruck>' |
SET <Set-Name>
AS
'<Set-Ausdruck>'] . . .]
SELECT
[<Achse_Spezifikation> [, <Achse_Spezifikation>...]]
FROM
[<Cube_Spezifikation>]
[WHERE
[<Slicer_Spezifikation>]]
WITH-Klausel (optional)
WITH-Klausel (optional)
Die With-Klausel ist optional und ermöglicht die Kalkulation von Members oder benannten Datensätzen
während der Bearbeitung der Select- oder Where-Befehle, sozusagen On-the-Fly.
SELECT-Klausel
In der Select-Klausel werden die Achsen durch die Festlegung der Dimensionsmembers für jede Achse
(Columns bzw. Rows) definiert. Die Anzahl der Members einer Dimension in einer MDX-Abfrage wird somit in
der Select-Klausel definiert. Die Members jeder Dimension müssen für jede Achse der MDX-Abfrage
genau festgelegt werden.
FROM-Klausel
Der abgefragte Cube wird in der From-Klausel bezeichnet. Sie legt fest, welche multidimensionale
Datenquelle beim Extrahieren der Daten benutzt werden soll. Die From-Klausel darf nur einen einzigen
Cube enthalten.
WHERE-Klausel (optional)
In der optionalen Where-Klausel werden die Ergebnisdaten eingeschränkt. Die durch die Where-Klausel
eingeschränkte Achse wird oft als Slicer bezeichnet. Die Where-Klausel legt fest, welche Dimension
oder welcher Member als ein Slicer verwendet wird. Dies beschränkt die Ergebnismenge der Daten auf
ein bestimmte Dimension oder einen bestimmten Member ein. Jede Dimension, die nicht in der Select-Klausel
angesprochen wird, kann als Slicer definiert werden.
Die vollständigen Spezifikationen sind im Microsoft Developer Network (MSDN) zu finden: Microsoft MSDN.
Beispiel
Die Aufgabe von MDX sowie die einzelnen Bauelemente der obigen Struktur lassen sich anhand eines Beispiels verdeutlichen.
Folgende Fragestellung: Der Kunde benötigt die Gesamtumsätze (Total Sales) und Gesamtkosten (Total Cost Amounts) für alle in den USA verkauften Produkte einzeln für die Jahre 1997 und 1998. Die Ergebnisse sollen in einer zweidimensionalen Tabelle dargestellt werden, die Umsätze bzw. Kosten, die so genannten Measures, in den Reihen und die Jahre in den Spalten.
Die MDX Abfrage würde folgendermaßen aussehen:
Im Folgenden die MDX Abfrage detailliert diskutiert.
- Die erste Zeile der Abfrage ist ein Kommentar. Die zwei Bindestriche (--) stellen eine von drei Möglichkeiten dar, einen Kommentar in die MDX Syntax einzufügen. Die nachfolgenden Zeichen dieser Zeile werden beim Ausführen der Abfrage vom Parser ignoriert. Diese Möglichkeit ist auch in SQL sehr verbreitet. Analog funktioniert – allerdings nur im MDX – der doppelte Schrägstrich //. Soll Text über eine Zeile hinweg als Kommentar eingegeben werden, bietet sich „/* … */“ als Zeichenkette sowohl im MDX als auch in SQL an.
- Der Cube, der durch die Abfrage angesprochen wird, befindet sich in der From-Klausel der Abfrage. Die From-Klausel funktioniert in MDX ähnlich wie in SQL. Die From-Klausel in MDX darf auf nur einen Cube verweisen.
- Die Abfragesyntax benutzt auch andere Schlüsselwörter aus SQL, wie zum Beispiel SELECT und WHERE. Obwohl es offensichtliche Ähnlichkeiten zwischen den beiden Sprachen gibt, existieren auch signifikante Unterschiede. Ein wichtiger Unterschied ist, dass die Ausgabe einer MDX Abfrage ein Cube ist, während die Ausgabe einer SQL Abfrage eine Spaltentabelle ist. Näheres zum Unterschied zwischen MDX und SQL finden Sie hier.
- Eine MDX Abfrage hat eine oder mehrere Achsen. Diese Beispielabfrage hat zwei Achsen. Die ersten drei Achsen, die in MDX-Abfragen vorkommen können, heißen „columns“ (Spalten), „rows“ (Zeilen) und „pages“ (Seiten). In einer Abfrage ist die Reihenfolge einzuhalten: columns vor rows vor pages. Die Achsen in der Beispielabfrage werden durch die Benutzung der Achsenaliase „columns“ und „rows“ definiert. Es können auch die Ordnungspositionen (0, 1, 2) verwendet werden.
- Auf der Ergebnisachse kann mehr als eine Dimension dargestellt werden. In diesem Fall entsteht das Ergebnis als eine Überschneidung und jede Zelle der angesprochenen Achsen bezieht sich auf die Aufsummierung der Measures eines Members aus jeder der indizierten Dimensionen. Wenn mehr als eine Dimension auf einer Achse abgebildet sind, spricht man davon, dass die Achse aus „Tupeln" besteht, die die Members jeder der abgebildeten Dimensionen enthält.
- Die Where-Klausel wird auch „Slicer“ genannt, da sie eine oder mehreren Scheiben aus den Cube heraus „schneidet“ und damit die Abfrage auf einen definierten Bereich des Cubes begrenzt.
- Dimensionen, die innerhalb von Achsen einer Abfrage nicht definiert sind, haben als Vorgabe definierte Members; man kann solche Members in der Where-Klausel festlegen, wie in dem Abfragebeispiel.
Die Ergebnisse der Beispielabfrage sehen in SQL Server Analysis Services wie folgt aus:
