Share via


Grundlegendes zu Durchlauf- und Lösungsreihenfolge (MDX)

Wird ein Cube als Ergebnis eines MDX-Skripts berechnet, durchläuft er, abhängig von der Verwendung verschiedener Berechnungsfeatures, möglicherweise viele Berechnungsphasen. Jede Phase bezeichnet man als Berechnungsdurchlauf.

Auf einen Berechnungsdurchlauf kann durch eine Ordnungsposition verwiesen werden, die Berechnungsdurchlaufnummer genannt wird. Die Anzahl an Berechnungsdurchläufen, die für eine vollständige Berechnung aller Zellen eines Cubes erforderlich sind, wird als Berechnungsdurchlauftiefe des Cubes bezeichnet.

Faktentabelle und Rückschreibedaten wirken sich nur auf Durchlauf 0 aus. Skripts füllen Daten nach Durchlauf 0 auf. Durch jede Zuweisung und Berechnungsanweisung in einem Skript wird ein neuer Durchlauf erstellt. Außerhalb des MDX-Skripts beziehen sich Verweise auf den absoluten Durchlauf 0 auf den letzten Durchlauf, der durch das Skript für den Cube erstellt wurde.

Berechnete Elemente werden in allen Durchläufen erstellt, aber der Ausdruck wird auf den aktuellen Durchlauf angewendet. Vorherige Durchläufe enthalten das berechnete Measure, allerdings mit einem NULL-Wert.

Lösungsreihenfolge

Die Lösungsreihenfolge bestimmt die Priorität der Berechnung bei konkurrierenden Ausdrücken. Innerhalb eines einzelnen Durchlaufes bestimmt die Lösungsreihenfolge zwei Dinge:

  • Die Reihenfolge, in der MicrosoftSQL ServerAnalysis Services Dimensionen, Elemente, berechnete Elemente, benutzerdefinierte Rollups und berechnete Zellen auswertet.

  • Die Reihenfolge, in der Analysis Services benutzerdefinierte Elemente, berechnete Elemente, benutzerdefinierte Rollups und berechnete Zellen berechnet.

Das Element mit der höchsten Lösungsreihenfolge hat Vorrang.

HinweisHinweis

Dies gilt jedoch nicht für die Aggregatfunktion. Mit der Aggregatfunktion berechnete Elemente haben eine niedrigere Lösungsreihenfolge als alle berechneten Measures, die eine Schnittmenge bilden.

Berechnungsrangfolge

Die Berechnungsrangfolge definiert die Reihenfolge, in der Werte für einen definierten Ausdruck in der aktiven Zelle abgerufen werden. Die Berechnungsrangfolge wird nach folgendem Algorithmus aufgelöst:

  1. Eine Berechnungsliste (Calculation List, CL) wird aus allen Berechnungen mit mindestens der Granularität der aktiven Zelle erstellt.

  2. Berechnungen in der Berechnungsliste werden wie folgt klassifiziert: Höchster gewinnt (Highest Wins, HW) oder Nächster gewinnt (Closest Wins, CW).

    1. CW sind benutzerdefinierte Rollups, unäre Operatoren, semiadditive Measures, Fixierungen.

    2. HW sind alle anderen Berechnungen.

  3. Eine sortierte Berechnungsliste (Ordered Calculation List, OCL) wird auf Grundlage aller HWs erstellt und nach Durchlauf sortiert.

  4. Für jeden verbleibenden CW

    1. Für jede Berechnung (Calculation, C) in OCL (vom Höchsten zum Niedrigsten)

    2. Wenn CW der aktuellen Zelle eher entspricht als C, fügen Sie CW in OCL ein, und fahren Sie mit dem nächsten CW fort.

    3. Wenn CW in einem höheren Durchlauf ist als C, fügen Sie CW in OCL ein, und fahren Sie mit dem nächsten CW fort.

    4. Fahren mit der nächsten C fort.

  5. Wenn die höchste Berechnung in OCL nicht die gleiche Granularität wie die aktuelle Zelle hat, berechnen Sie mithilfe der Aggregatfunktionen den Aggregatwert.

Werte der Lösungsreihenfolge und Rangfolge

Werte der Lösungsreihenfolge können im Bereich von -8.181 bis 65.535 liegen. In diesem Bereich entsprechen einige Werte der Lösungsreihenfolge bestimmten Berechnungsarten, wie in der folgenden Tabelle gezeigt.

Berechnung

Lösungsreihenfolge

Benutzerdefinierte Elementformeln

-5119

Unäre Operatoren

-5119

Berechnung sichtbarer Gesamtwerte

-4096

Alle anderen Berechnungen (wenn nicht anders angegeben)

0

Beim Festlegen von Werten der Lösungsreihenfolge sollten Sie unbedingt nur positive ganze Zahlen verwenden. Wenn Sie Werte zuweisen, die niedriger sind als die in der vorherigen Tabelle angezeigten Werte der Lösungsreihenfolge, kann der Berechnungsdurchlauf unvorhersehbar werden. Angenommen, die Berechnung für ein berechnetes Element erhält einen Wert der Lösungsreihenfolge, der niedriger ist als der Standardformelwert für benutzerdefinierte Rollups von -5.119. Ein so niedriger Wert der Lösungsreihenfolge führt dazu, dass die berechneten Elemente vor den benutzerdefinierten Rollupformeln berechnet werden. Dies kann zu falschen Ergebnissen führen.

Erstellen und Ändern der Lösungsreihenfolge

Im Cube-Designer können Sie im Bereich Berechnungen die Lösungsreihenfolge für berechnete Elemente und berechnete Zellen ändern, indem Sie die Reihenfolge der Berechnungen ändern.

In MDX können Sie mit dem SOLVE_ORDER-Schlüsselwort berechnete Elemente und berechnete Zellen erstellen bzw. ändern.

Beispiele für die Lösungsreihenfolge

Um die mögliche Komplexität der Lösungsreihenfolge zu veranschaulichen, beginnt die folgende Reihe von MDX-Abfragen mit zwei Abfragen, die einzeln betrachtet keine Probleme mit der Lösungsreihenfolge aufweisen. Sie werden dann in eine Abfrage kombiniert, für die eine Lösungsreihenfolge erforderlich ist.

Abfrage 1 – Differenzen zwischen Income und Expenses

Mit der ersten MDX-Abfrage sollen die Differenzen zwischen Einnahmen (Income) und Ausgaben (Expenses) für jedes Halbjahr ermittelt werden. Erstellen Sie dazu eine einfache MDX-Abfrage wie im folgenden Beispiel:

WITH
MEMBER [Time].[Year Difference] AS
   [Time].[2nd half] - [Time].[1st half]
SELECT 
   { [Account].[Income], [Account].[Expenses] } ON COLUMNS,
   { [Time].[1st half], [Time].[2nd half], [Time].[Year Difference] } ON ROWS
FROM Financials

Diese Abfrage enthält als einziges berechnetes Element Year Difference. Da nur ein berechnetes Element vorhanden ist, stellt die Lösungsreihenfolge kein Problem dar, vorausgesetzt der Cube verwendet keine berechneten Elemente.

Mit dieser MDX-Abfrage wird ein der folgenden Tabelle ähnelndes Resultset erstellt.

 

Income

Expenses

1st half

5000

4200

2nd half

8000

7000

Year Difference

3000

2800

Abfrage 2 – Prozentsatz von Net Income nach Abzug von Expenses

Mit der zweiten Abfrage soll der Prozentsatz des Nettoeinkommens (Net Income) nach Abzug der Ausgaben (Expenses) für jedes Halbjahr ermittelt werden. Verwenden Sie dazu die folgende MDX-Abfrage:

WITH
MEMBER [Account].[Net Income] AS
   ([Account].[Income],  [Account].[Expenses]) / [Account].[Income]
SELECT
   { [Account].[Income], [Account].[Expenses], [Account].[Net Income] } ON COLUMNS,
   { [Time].[1st half], [Time].[2nd half] } ON ROWS
FROM Financials

Wie die vorherige MDX-Abfrage enthält auch diese nur ein berechnetes Element, Net Income, und muss daher keine Lösungsreihenfolge berücksichtigen.

Mit dieser MDX-Abfrage wird ein etwas anderes Resultset erstellt, ähnlich der folgenden Tabelle.

 

Income

Expenses

Net Income

1st half

5000

4200

0,16

2nd half

8000

7000

0,125

Der Grund für die unterschiedlichen Resultsets aus der ersten und der zweiten Abfrage ist eine andere Platzierung des berechneten Elements. In der ersten Abfrage ist das berechnete Element Teil der ROWS-Achse und nicht der COLUMNS-Achse, wie in der zweiten Abfrage. Diese unterschiedliche Platzierung gewinnt in der nächsten Abfrage an Bedeutung, wenn die beiden berechneten Elemente in einer einzigen MDX-Abfrage kombiniert werden.

Abfrage 3 – Kombinierte Berechnungen für Year Difference und Net Income

In dieser letzten Abfrage, in der die beiden vorherigen Beispiele in einer einzigen MDX-Abfrage kombiniert werden, wird die Lösungsreihenfolge wichtig. Um sicherzustellen, dass die Berechnungen in der richtigen Reihenfolge vorgenommen werden, definieren Sie diese Reihenfolge mithilfe des SOLVE_ORDER-Schlüsselworts.

Das SOLVE_ORDER-Schlüsselwort gibt die Lösungsreihenfolge der berechneten Elemente in einer MDX-Abfrage oder einem CREATE MEMBER-Befehl an. Die mit dem SOLVE_ORDER-Schlüsselwort verwendeten ganzzahligen Werte sind relativ, müssen nicht mit 0 beginnen und nicht aufeinander folgen. Der Wert weist MDX lediglich an, ein Element auf der Grundlage von Werten zu berechnen, die aus der Berechnung von Elementen mit einem höheren Wert abgeleitet sind. Wird ein berechnetes Element ohne das SOLVE_ORDER-Schlüsselwort definiert, lautet sein Standardwert 0.

Wenn Sie beispielsweise die in den ersten beiden Beispielabfragen verwendeten Berechnungen kombinieren, überschneiden sich die beiden berechneten Elemente Year Difference und Net Income in einer einzelnen Zelle im Resultdataset der MDX-Beispielabfrage. Nur anhand der Lösungsreihenfolge lässt sich bestimmen, wie Analysis Services diese Zelle auswertet. Die Formeln, mit denen diese Zelle erstellt wird, erzeugen je nach Lösungsreihenfolge der beiden berechneten Elemente unterschiedliche Ergebnisse.

Versuchen Sie zunächst, die in den ersten beiden Abfragen verwendeten Berechnungen in der folgenden MDX-Abfrage zu kombinieren:

WITH
MEMBER [Time].[Year Difference] AS
   '[Time].[2nd half] - [Time].[1st half],
   SOLVE_ORDER = 1
MEMBER [Account].[Net Income] AS
   '([Account].[Income] - [Account].[Expenses]) / [Account].[Income]',
   SOLVE_ORDER = 2
SELECT
   { [Account].[Income], [Account].[Expenses], [Account].[Net Income] } ON COLUMNS,
   { [Time].[1st half], [Time].[2nd half], [Time].[Year Difference] } ON ROWS
FROM Financials

In diesem kombinierten MDX-Abfragebeispiel hat Net Income die höchste Position in der Lösungsreihenfolge, hat also bei Interaktion der beiden Ausdrücke Vorrang. Analysis Services wertet die fragliche Zelle mithilfe der Net Income-Formel aus. Das Ergebnis dieser geschachtelten Berechnung ist in der folgenden Tabelle dargestellt.

 

Income

Expenses

Net Income

1st half

5000

4200

0,16

2nd half

8000

7000

0,125

Year Difference

3000

2800

0,066

Das Ergebnis in der freigegebenen Zelle basiert auf der Formel für Net Income. Analysis Services berechnet also das Ergebnis in der freigegebenen Zelle mit den Year Difference-Daten, wodurch folgende Formel erzeugt wird (das Ergebnis wurde zur besseren Übersicht gerundet):

((8000 - 5000) - (7000 - 4200)) / (8000 - 5000) = 0.066 

oder

(3000 - 2800) / 3000 = 0.066

Wenn die Lösungsreihenfolge für die berechneten Elemente in der MDX-Abfrage vertauscht wird, berechnet Analysis Services das Ergebnis in der freigegebenen Zelle jedoch anders. Mit der folgenden kombinierten MDX-Abfrage wird die Lösungsreihenfolge für berechnete Elemente umgekehrt:

WITH
MEMBER [Time].[Year Difference] AS
   '[Time].[2nd half] - [Time].[1st half],
   SOLVE_ORDER = 2
MEMBER [Money].[Net Income] AS
   '([Money].[Income] - [Money].[Expenses]) / [Money].[Income]',
   SOLVE_ORDER = 1
SELECT
   { [Money].[Income], [Money].[Expenses], [Money].[Net Income] } ON COLUMNS,
   { [Time].[1st half], [Time].[2nd half], [Time].[Year Difference] } ON ROWS
FROM TestCube

Da die Reihenfolge der berechneten Elemente vertauscht wurde, verwendet Analysis Services zum Auswerten der Zelle die Year Difference-Formel, wie in der folgenden Tabelle gezeigt.

 

Income

Expenses

Net Income

1st half

5000

4200

0,16

2nd half

8000

7000

0,125

Year Difference

3000

2800

-0,035

Da in dieser Abfrage die Year Difference-Formel mit den Daten für Net Income verwendet wird, gleicht die Formel für die freigegebene Zelle der folgenden Berechnung:

((8000 - 7000) / 8000) - ((5000 - 4200) / 5000) = -0.035 

- Oder -

0.125 - 0.16 = -0.035

Weitere Überlegungen

Die Lösungsreihenfolge kann ein sehr komplexes Problem darstellen, besonders in Cubes mit einer hohen Anzahl von Dimensionen, die berechnete Elemente, benutzerdefinierte Rollupformeln oder berechnete Zellen beinhalten. Wenn Analysis Services eine MDX-Abfrage auswertet, berücksichtigt Analysis Services die Werte der Lösungsreihenfolge für alle Teile in einem bestimmten Durchlauf, einschließlich der Dimensionen des in der MDX-Abfrage angegebenen Cubes.