Freigeben über


Grundlegendes zu Passreihenfolge und Solve Order (MDX)

Wenn ein Cube als Ergebnis eines MDX-Skripts berechnet wird, kann er je nach Verwendung verschiedener berechnungsbezogener Features viele Phasen der Berechnung durchlaufen. Jede dieser Phasen wird als Berechnungsdurchlauf bezeichnet.

Auf einen Berechnungsdurchlauf kann durch eine Ordnungsposition verwiesen werden, die als Berechnungsdurchlaufnummer bezeichnet wird. Die Anzahl der Berechnungsdurchläufe, die erforderlich sind, um alle Zellen eines Cubes vollständig zu berechnen, wird als Berechnungsdurchlauftiefe des Cubes bezeichnet.

Faktentabelle und Rückschreibdaten wirken sich nur auf Durchgang 0 aus. Skripts füllen Daten nach Pass 0 auf; Jede Zuordnung und Berechnungsanweisung in einem Skript erstellt einen neuen Durchlauf. Außerhalb des MDX-Skripts verweisen Verweise auf absolute Pass 0 auf den letzten Durchlauf, der vom Skript für den Cube erstellt wurde.

Berechnete Elemente werden bei jedem Durchlauf erstellt, aber der Ausdruck wird beim aktuellen Durchlauf angewendet. Vorherige Durchgänge enthalten die berechnete Kennzahl, jedoch mit einem null-Wert.

Lösungsreihenfolge

Die Lösungsreihenfolge bestimmt die Priorität der Berechnung im Falle konkurrierender Ausdrücke. Innerhalb eines einzelnen Durchlaufs bestimmt die Lösungsreihenfolge zwei Dinge:

  • Die Reihenfolge, in der Microsoft SQL Server Analysis Services Dimensionen, Member, berechnete Member, benutzerdefinierte Rollups und berechnete Zellen auswertet.

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

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

Hinweis

Die Ausnahme von dieser Rangfolge ist die Aggregatfunktion. Berechnete Elemente mit der Aggregatfunktion haben eine niedrigere Lösungsreihenfolge als alle sich überschneidenden berechneten Maße.

Reihenfolgewert und Vorrang bestimmen

Der Lösungsreihenfolgenwert kann zwischen -8181 und 65535 liegen. In diesem Bereich entsprechen einige Werte der Lösungsreihenfolge bestimmten Berechnungstypen, wie in der folgenden Tabelle gezeigt.

Berechnung Lösungsreihenfolge
Benutzerdefinierte Memberformeln -5119
Unäre Operatoren -5119
Berechnung visueller Summen -4096
Alle anderen Berechnungen (falls nicht anders angegeben) 0

Es wird dringend empfohlen, beim Festlegen von Bestellwerten nur positive ganze Zahlen zu verwenden. Wenn Sie Werte zuweisen, die niedriger als die in der vorherigen Tabelle dargestellten Solve-Bestellwerte sind, kann der Berechnungsdurchlauf unvorhersehbar werden. Die Berechnung für ein berechnetes Element erhält z. B. einen Lösungsreihenfolgewert, der niedriger als der Standardwert für benutzerdefinierte Rollupformeln von -5119 ist. Ein solcher niedriger Lösungsreihenfolgewert bewirkt, dass die berechneten Elemente vor den benutzerdefinierten Rollupformeln berechnet werden und falsche Ergebnisse erzielen können.

Erstellen und Ändern der Lösungsreihenfolge

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

In MDX können Sie das SOLVE_ORDER Schlüsselwort verwenden, um berechnete Elemente und berechnete Zellen zu erstellen oder zu ändern.

Lösungsreihenfolgebeispiele

Um die potenziellen Komplexitäten der Lösungsreihenfolge zu veranschaulichen, beginnt die folgende Reihe von MDX-Abfragen mit zwei Abfragen, die jeweils einzeln keine Lösungsreihenfolgeprobleme haben. Diese beiden Abfragen werden dann in einer Abfrage kombiniert, die eine Lösungsreihenfolge erfordert.

Hinweis

Sie können diese MDX-Abfragen für die multidimensionale Adventure Works-Beispieldatenbank ausführen. Sie können das SQL Server 2012-Beispiel für adventureWorks Multidimensional Models von der Codeplex-Website herunterladen.

Abfrage 1-Unterschiede bei Einnahmen und Ausgaben

Berechnen Sie für die erste MDX-Abfrage die Differenz der Umsätze und Kosten für jedes Jahr, indem Sie eine einfache MDX-Abfrage erstellen, die dem folgenden Beispiel ähnelt:

WITH   
MEMBER  
[Date].[Calendar].[Year Difference] AS ([Date].[Calendar].[Calendar Year].&[2008] - [Date].[Calendar].[Calendar Year].&[2007] )  
SELECT   
{[Measures].[Internet Sales Amount], [Measures].[Internet Total Product Cost] }  
ON COLUMNS ,  
{ [Date].[Calendar].[Calendar Year].&[2007], [Date].[Calendar].[Calendar Year].&[2008], [Date].[Year Difference] }  
ON ROWS  
FROM [Adventure Works]  

In dieser Abfrage gibt es nur ein berechnetes Element, Year Difference. Da nur ein berechnetes Element vorhanden ist, ist die Lösungsreihenfolge kein Problem, solange der Cube keine berechneten Elemente verwendet.

Diese MDX-Abfrage erzeugt ein Resultset ähnlich der folgenden Tabelle.

Internetumsatzbetrag Internet-Gesamtproduktkosten
CY 2007 $9,791,060,30 $5,718,327,17
CY 2008 $9.770.899,74 $5,721,205.24
Jahresdifferenz ($20.160.56) $2.878.06

Abfrage: 2 - Prozentsatz des Einkommens nach Ausgaben

Berechnen Sie für die zweite Abfrage den Prozentsatz der Einnahmen nach Ausgaben für jedes Jahr mithilfe der folgenden MDX-Abfrage:

WITH   
MEMBER  
[Measures].[Profit Margin] AS   
([Measures].[Internet Sales Amount] - [Measures].[Internet Total Product Cost] ) / [Measures].[Internet Sales Amount] ,  
FORMAT_STRING="Percent"  
SELECT   
{[Measures].[Internet Sales Amount], [Measures].[Internet Total Product Cost], [Measures].[Profit Margin] }  
ON COLUMNS ,  
{ [Date].[Calendar].[Calendar Year].&[2007], [Date].[Calendar].[Calendar Year].&[2008] }  
ON ROWS  
FROM [Adventure Works]  

Diese MDX-Abfrage wie der vorherige hat nur ein einzelnes berechnetes Element, Profit Marginund daher gibt es keine Lösungsreihenfolgenkomplikationen.

Diese MDX-Abfrage erzeugt ein etwas anderes Resultset, ähnlich der folgenden Tabelle.

Internetumsatzbetrag Internet-Gesamtproduktkosten Gewinnspanne
CY 2007 $9,791,060,30 $5,718,327,17 41.60%
CY 2008 $9.770.899,74 $5,721,205.24 41.45%

Der Unterschied der Ergebnismengen zwischen der ersten Abfrage und der zweiten Abfrage resultiert aus der unterschiedlichen Platzierung des berechneten Members. In der ersten Abfrage ist das berechnete Element Teil der Zeilenachse, nicht der Spaltenachse, die in der zweiten Abfrage angezeigt wird. Dieser Unterschied bei der Platzierung wird in der nächsten Abfrage wichtig, wodurch die beiden berechneten Elemente in einer einzelnen MDX-Abfrage kombiniert werden.

Abfrage 3-Kombinierte Jahresdifferenz und Nettoeinkommensberechnungen

In dieser abschließenden Abfrage, die beide der vorherigen Beispiele in einer einzelnen MDX-Abfrage kombiniert, wird die Lösungsreihenfolge aufgrund der Berechnungen für Spalten und Zeilen wichtig. Um sicherzustellen, dass die Berechnungen in der richtigen Reihenfolge auftreten, definieren Sie die Reihenfolge, in der die Berechnungen mithilfe des SOLVE_ORDER Schlüsselworts auftreten.

Das SOLVE_ORDER Schlüsselwort gibt die Lösungsreihenfolge berechneter 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 Null beginnen und müssen nicht aufeinander folgen. Der Wert weist MDX einfach an, ein Element basierend auf Werten zu berechnen, die von der Berechnung von Elementen mit einem höheren Wert abgeleitet wurden. Wenn ein berechnetes Element ohne das SOLVE_ORDER Schlüsselwort definiert ist, ist der Standardwert dieses berechneten Elements Null.

Wenn Sie beispielsweise die Berechnungen kombinieren, die in den ersten beiden Beispielabfragen verwendet werden, schneiden sich die beiden berechneten Mitglieder Year Difference und Profit Margin in einer einzelnen Zelle im Ergebnisdatensatz des MDX-Abfragebeispiels. Die einzige Möglichkeit, zu bestimmen, wie Analysis Services diese Zelle auswertet, ist die Lösungsreihenfolge. Die Formeln, die zum Konstruieren dieser Zelle verwendet werden, erzeugen je nach Lösungsreihenfolge der beiden berechneten Elemente unterschiedliche Ergebnisse.

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

WITH   
MEMBER  
[Date].[Calendar].[Year Difference] AS ([Date].[Calendar].[Calendar Year].&[2008] - [Date].[Calendar].[Calendar Year].&[2007] ) ,  
SOLVE_ORDER = 1  
MEMBER  
[Measures].[Profit Margin] AS   
( [Measures].[Internet Sales Amount] - [Measures].[Internet Total Product Cost] ) / [Measures].[Internet Sales Amount] ,  
FORMAT_STRING="Percent" ,  
SOLVE_ORDER = 2  
SELECT   
{[Measures].[Internet Sales Amount], [Measures].[Internet Total Product Cost], [Measures].[Profit Margin] }  
ON COLUMNS ,  
{ [Date].[Calendar].[Calendar Year].&[2007], [Date].[Calendar].[Calendar Year].&[2008], [Date].[Year Difference] }  
ON ROWS  
FROM [Adventure Works]  

In diesem kombinierten MDX-Abfragebeispiel Profit Margin hat die höchste Lösungsreihenfolge, sodass sie Vorrang hat, wenn die beiden Ausdrücke interagieren. Analysis Services wertet die fragliche Zelle mithilfe der Profit Margin Formel aus. Die Ergebnisse dieser geschachtelten Berechnung, wie in der folgenden Tabelle dargestellt.

Internetumsatzbetrag Internet-Gesamtproduktkosten Gewinnspanne
CY 2007 $9,791,060,30 $5,718,327,17 41.60%
CY 2008 $9.770.899,74 $5,721,205.24 41.45%
Jahresdifferenz ($20.160.56) $2.878.06 114.28%

Das Ergebnis in der freigegebenen Zelle basiert auf der Formel für Profit Margin. Das heißt, Analysis Services berechnet das Ergebnis in der freigegebenen Zelle mit den Year Difference Daten und erzeugt die folgende Formel (das Ergebnis wird aus Gründen der Übersichtlichkeit gerundet):

((9,770,899.74 - 9,791,060.30) - (5,721,205.24 - 5,718,327.17)) / (9,770,899.74 - 9,791,060.30) = 1.14275744   

oder

(23,038.63) / (20,160.56) = 114.28%  

Das ist eindeutig falsch. Analysis Services berechnet jedoch das Ergebnis in der gemeinsamen Zelle anders, wenn Sie die Berechnungsreihenfolge der berechneten Mitglieder in der MDX-Abfrage ändern. Die folgende kombinierte MDX-Abfrage kehrt die Lösungsreihenfolge für die berechneten Elemente um:

WITH   
MEMBER  
[Date].[Calendar].[Year Difference] AS ([Date].[Calendar].[Calendar Year].&[2008] - [Date].[Calendar].[Calendar Year].&[2007] ) ,  
SOLVE_ORDER = 2  
MEMBER  
[Measures].[Profit Margin] AS   
( [Measures].[Internet Sales Amount] - [Measures].[Internet Total Product Cost] ) / [Measures].[Internet Sales Amount] ,  
FORMAT_STRING="Percent" ,  
SOLVE_ORDER = 1  
SELECT   
{[Measures].[Internet Sales Amount], [Measures].[Internet Total Product Cost], [Measures].[Profit Margin] }  
ON COLUMNS ,  
{ [Date].[Calendar].[Calendar Year].&[2007], [Date].[Calendar].[Calendar Year].&[2008], [Date].[Year Difference] }  
ON ROWS  
FROM [Adventure Works]  

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

Internetumsatzbetrag Internet-Gesamtproduktkosten Gewinnspanne
CY 2007 $9,791,060,30 $5,718,327,17 41.60%
CY 2008 $9.770.899,74 $5,721,205.24 41.45%
Jahresdifferenz ($20.160.56) $2.878.06 (0.15%)

Da diese Abfrage die Year Difference Formel mit den Profit Margin Daten verwendet, ähnelt die Formel für die freigegebene Zelle der folgenden Berechnung:

(($9,770,899.74 - 5,721,205.24) / $9,770,899.74) - ((9,791,060.30 - 5,718,327.17) / 9,791,060.30) = -0.15   

Oder

0.4145 - 0.4160= -0.15  

Weitere Überlegungen

Die Lösungsreihenfolge kann ein sehr komplexes Problem sein, das angegangen werden muss, insbesondere in „Cubes“ mit einer hohen Anzahl von Dimensionen, die berechnete Member, benutzerdefinierte Rollupformeln oder berechnete Zellen umfassen. Wenn Analysis Services eine MDX-Abfrage auswertet, berücksichtigt Analysis Services die Lösungsreihenfolgewerte für alles, was innerhalb eines bestimmten Durchlaufs beteiligt ist, einschließlich der Dimensionen des in der MDX-Abfrage angegebenen Cubes.

Siehe auch

CalculationCurrentPass (MDX)
CalculationPassValue (MDX)
CREATE MEMBER-Anweisung (MDX)
Bearbeiten von Daten (MDX)