Leistungsverbesserungen für MDX in SQL Server 2008 Analysis Services
Bei dieser Version von Analysis Services wurde besonderer Wert auf die Verbesserung der Leistung bei der Ausführung von MDX-Berechnungen (Multidimensional Expressions) gelegt. Um diese Leistungsverbesserungen zu erreichen, wurden an der Modularchitektur verschiedene wichtige Änderungen vorgenommen. Damit Sie von diesen Verbesserungen auch tatsächlich profitieren können, müssen Sie jedoch Ihren MDX-Code optimieren.
In diesem erfahren Sie mehr zu den Problemen, die in Ihrem vorhandenen MDX auftreten können und die Nutzung der Leistungsverbesserungen verhindern. Zudem finden Sie hier Hinweise, wie sie diese Probleme in Ihrem neuen MDX-Code vermeiden können. In diesem Dokument sind auch die Funktionen aufgeführt, die von den Leistungsverbesserungen profitieren.
Überprüfen des Codes für maximale Leistungsverbesserungen in MDX
Versuchen Sie, bei der Überprüfung des Codes folgende Szenarien bzw. Codesituationen zu vermeiden, da die MDX-Anweisungen anderenfalls nicht die in SQL Server 2008 Analysis Services (SSAS) erwarteten Leistungsverbesserungen erreichen können. Sollten Sie jedoch keine Möglichkeit haben, Ihren Code so zu ändern, dass die aufgeführten Situationen vermieden werden, können Sie von Ihrem MDX-Code dasselbe Leistungsniveau wie in SQL Server 2005 Analysis Services (SSAS) erwarten.
Nützliche Definitionen
Raum
Die Menge von Zellen, über die ein Ausdruck ausgewertet wird.
Willkürliche Form
Ein Raum, der nicht als kartesisches Produkt von zwei oder mehr Mengen ausgedrückt werden kann. So repräsentiert z. B. der Raum {(Drink, USA), (Food, Canada)} eine willkürliche Form, da er eine Teilmenge des kartesischen Produkts von {Drink, Food} * {USA, Canada} = {(Drink, USA), (Drink, Canada), (Food, USA), (Food, Canada)} darstellt.
Statischer Ausdruck
Ein Ausdruck ist dann statisch, wenn er über den Raum, in dem er berechnet wird, invariant ist.
So sind z. B. die folgenden Ausdrücke über den Raum von CrossJoin(Product.Members, Customer.Members) invariant.
1, ein konstanter Ausdruck
Product.Members.Count
Dynamischer Ausdruck
Ein Ausdruck ist dann dynamisch, wenn er über den Raum, in dem er berechnet wird, für jede Zelle in einen anderen Wert aufgelöst wird.
So sind z. B. die folgenden Ausdrücke über den Raum von CrossJoin(Product.Members, Customer.Members) dynamisch.
- Sales, da es sich bei Verkauf um ein Measure handelt, hat er für jede Zelle innerhalb des Raums einen anderen Wert.
Veränderliches Attribut
Ein veränderliches Attribut bestimmt, wie der Ausdruck ausgewertet wird, und macht den Ausdruck davon abhängig. So hängt z. B. der Ausdruck Customer.Geography.CurrentMember von den Attributen in der geografischen Hierarchie ab.
In der Regel wird der Raum, über den Ausdrücke ausgewertet werden, durch veränderliche Attribute verringert. Betrachten Sie hierzu den folgenden Ausdruck:
with member measures.x as Customers.Geography.currentmember.uniquename
Select Customers.Geography.City.members on 0,
Product.members on 1
From sales
Where measures.x
In diesem Ausdruck ist Customers.Geography ein statischer Ausdruck. Die Funktion currentmember ist ein veränderliches Attribut, da es das City-Attribut mit einer Abhängigkeit versieht. Uniquename fügt keine veränderlichen Attribute hinzu, da es in einer 1:1-Beziehung an currentmember gebunden ist. Daher wird uniquename für jeden Kunden nur einmal ausgewertet und nicht für jedes Product wiederholt. Deshalb wurde der gesamte Ausdrucksraum praktisch über das veränderliche Attribut verringert.
Verwendung von Ausdrücken in Zelleneigenschaften ohne Wert
Jeder MDX-Ausdruck, mit dem der Wert einer Zelleneigenschaft ohne Wert zugewiesen wird, profitiert nicht von den Leistungsverbesserungen. Die Leistung entspricht demselben Niveau wie bei SQL Server 2005 Analysis Services (SSAS).
Verwendung nicht aufgelisteter Funktionen
Alle Funktionen in Ihrem MDX-Code, die nicht in diesem Dokument aufgelistet ist, profitieren nicht von den erwarteten Leistungsverbesserungen dieser Version des Produkts. Siehe Functions with enhanced performance in diesem Dokument.
Verwendung der Zellensicherheit
Die Auswertung eines MDX-Ausdrucks in einem Raum, für den Zellensicherheit definiert ist, verhindert die Nutzung der Leistungsverbesserung.
Die Beziehung zwischen Zellensicherheit und Leistung ist in der folgenden Tabelle dargestellt.
Zellensicherheit |
Erwartete Leistung |
---|---|
Keine |
Am höchsten |
Lesen |
Mittel |
Abhängiges Lesen |
Am niedrigsten |
Siehe Verwenden von MDX-Ausdrücken zum Festlegen von Berechtigungen für Zellendaten und Erteilen von benutzerdefiniertem Zugriff auf Zellendaten
Verwendung dynamischer Dimensionalität
Die Verwendung von Ausdrücken dynamischer Dimensionalität im MDX-Code verhindert eine Verbesserung der Leistung. So profitieren z. B. Ausdrücke wie Sum( IIF( Sales > 10000, h1.Members, h2.Members)) nicht von den Verbesserungen, da die Elemente bei der Auswertung des Sales-Ausdrucks addiert werden. Ein anderes Beispiel wäre ein Szenario, in dem Sie entweder ein Element aus der Kalenderjahr- oder aus der Geschäftsjahr-Hierarchie verwenden müssen, das von einem Attribut abhängt, das zu dem aktuellen Element des Kontoattributs gehört, um einen Vergleich mit dem entsprechenden Wert eines parallelen Zeitraums vorzunehmen. Der für dieses Szenario erforderliche MDX-Ausdruck würde in etwa dem folgenden Beispielcode entsprechen.
ParallelPeriod(Iif( Account.CurrentMember.Properties("UsesFiscalCalendar")="Y", FiscalTime, CalendarTime).CurrentMember)
Auch hier werden die Dimensionen dynamisch angepasst, wenn sich das aktuelle Element der Kontodimension ändert.
Verwendung dynamischer Parameter
Die Verwendung dynamischer Parameter im MDX-Code verhindert eine Verbesserung der Leistung. So variiert z. B. ein Ausdruck wie KpiGoal("Sales_" & [Fiscal Year].currentmember.UniqueName) innerhalb der Zellen, in denen er berechnet wird. Der Ausdruck KpiGoal("Sales_" & Cstr(Year(Now))) ist hingegen invariant.
Wichtig |
---|
Möglicherweise wird der Ausdruck KpiGoal("Sales_" & [Fiscal Year].currentmember.UniqueName) über den Raum, in dem er berechnet wird, anhand desselben Werts ausgewertet. Dies reicht jedoch nicht aus, um die erwarteten Leistungsverbesserungen zu erzielen. |
Dynamische Elementverweise
Die Verwendung dynamischer Elementverweise im MDX-Code verhindert eine Verbesserung der Leistung. So lässt sich z. B. im Ausdruck
(IIF( e, mbr1, mbr2), Sales)
das resultierende Tupel erst vorhersagen, wenn der Ausdruck IIF() zur Ausführungszeit ausgewertet wurde. Im ähnlichen Ausdruck
IIF( e, (mbr1, Sales), (mbr1, Sales))
sind hingegen beide resultierende Tupel vor der Auswertung des Ausdrucks e bekannt.
Planhinweise
Planhinweise sind eine Erweiterung der MDX-Sprache und zeigen dem Modul an, wie Ausdrücke auszuwerten sind. In dieser Version von Analysis Services werden Planhinweise nur über die IIF(,,)-Funktion eingeführt.
Planhinweise können im MDX-Ausdruck angegeben oder über die Serverkonfigurationseigenschaften global konfiguriert werden.
Planhinweise in IIF()-Funktionen
In IIF(,,) werden Ausdruckshinweise mit der folgenden Syntax angegeben:
IIF(<cond>, <expr>, <expr>) [HINT <hints>]
<expr> ::= <expr> [HINT <hints>]
<hints> ::= <hint> [<hints>]
<hint> ::= EAGER | STRICT | LAZY
EAGER veranlasst eine Auswertung des Ausdrucks im gesamten IIF-Teilbereich.
STRICT veranlasst eine Auswertung des Ausdrucks, die auf den resultierenden Teilbereich begrenzt ist, der den Ergebnissen des Bedingungsausdrucks entspricht.
LAZY veranlasst eine Auswertung des Ausdrucks in einem zellenweisen Modus.
EAGER und STRICT schließen sich im Hinweis gegenseitig aus. Sie können im selben IIF(,,) für verschiedene Ausdrücke verwendet werden.
Ein Syntaxbeispiel:
IIF([Measures].[Internet Sales Amount]=0
, {([Date].[Calendar Year].CURRENTMEMBER, [Customer].[Country].[All Customers])} HINT EAGER
, {{[Date].[Calendar Year].CURRENTMEMBER} * [Customer].[Country].[Country].MEMBERS} STRICT LAZY
)
Planhinweise in Konfigurationseigenschaften
Die folgenden Konfigurationseigenschaften werden unter OLAP\Abfragepfad eingeführt, um Planhinweise zu unterstützen:
Eigenschaftsname |
Zulässige Werte |
Erklärung |
IIFThenMode |
0 | 1 | 2 |
0, Kein Hinweis (Standardwert) 1, EAGER 2, STRICT |
IIFElseMode |
0 | 1 | 2 |
0, Kein Hinweis (Standardwert) 1, EAGER 2, STRICT |
LazyEnabled |
0 | 1 |
0, Deaktiviert (Standardwert) 1, Aktiviert |
Benutzerdefinierte gespeicherte Funktionen (COM oder .NET)
Die Verwendung benutzerdefinierter gespeicherter Prozeduren im MDX-Code verhindert eine Verbesserung der Leistung.
Hinweis |
---|
SQL Server 2008 Analysis Services (SSAS) stellt gespeicherte Prozeduren bereit, die für die Leistungsverbesserung optimiert wurden. |
Verwendung von benannten Mengen oder festgelegtem Alias in Parametern
Immer dann, wenn eine benannte Menge oder ein festgelegtes Alias als erster Parameter in den Funktionen Sum, Min, Max, Avg oder Aggregate im MDX-Code verwendet wird, können die Leistungsverbesserungen nicht genutzt werden.
So zählt z. B. der folgende MDX-Ausdruck, wie viele Elemente über mehr als ein untergeordnetes Element verfügen.
Sum(h.members as S, Iif(S.Current.Children.Count > 1, 1, 0))
Da h.members das Alias S zugewiesen und der Wert der aktuellen Funktion später der mit dem Alias versehenen Menge entnommen wird, kann die erwartete Verbesserung der Leistung nicht erzielt werden.
Ein anderes häufiges Beispiel für diese Situation wird im folgenden Code veranschaulicht.
WITH
SET [Core Products] AS '{[Product].[Category].[Bikes]}'
MEMBER [Measures].[Core Products Sales] AS SUM([Core Products], [Measures].[Internet Average Unit Price] * [Measures].[Internet Order Quantity])
Select [Measures].[Core Products Sales] on 0
From [Adventure Works]
Die Funktion SUM in der Elementdefinition erzielt nicht die erwartete Leistungssteigerung, da sie auf einer benannten Menge basiert.
Verwendung später Bindungen in benutzerdefinierten Rollupausdrücken
Immer dann, wenn ein benutzerdefinierter Rollupausdruck oder ein anderer MDX-Ausdruck, der zur Ausführungszeit ausgewertet wird, auf ein berechnetes Element verweist, verhindert der benutzerdefinierte Rollupausdruck eine Verbesserung der Leistung.
Verwendung von Vorwärtsverweisen in Skripts
Immer dann, wenn Sie in separaten Anweisungen im MDX-Code Vorwärtsdefinitionsverweise erstellen, kann der Code nicht von den Leistungsverbesserungen profitieren. So wird z. B. im folgenden MDX-Skriptausschnitt während der Definition von X ein Vorwärtsverweis auf Y erstellt.
Create Member X as Y * 2;
…
Create Member Y as ( Sales, [Date].[Calendar].[Month].PreviousMember);
Um diese Situation zu korrigieren, sollten Sie wie in folgendem Ausschnitt die Definition von Y vor die Definition von X stellen.
Create Member Y as ( Sales, [Date].[Calendar].[Month].PreviousMember);
Create Member X as Y * 2;
…
Funktionen mit verbesserter Leistung
Skalarfunktionen
Die folgende Liste von Skalarfunktionen enthält die Funktionen, von denen eine verbesserte Leistung erwartet werden kann. Die erste Spalte in der Liste enthält die skalaren Operatoren.
- |
OR |
KEY |
* |
XOR |
LEVELS.COUNT |
/ |
CALCULATIONPASSVALUE |
MEMBERTOSTR |
+ |
CASE |
MEMBERVALUE |
< |
COALESCEEMPTY |
NAME |
<= |
HIERARCHIES.COUNT |
ORDINAL |
<> |
ID |
PROPERTIES |
= |
IIF |
UNIQUENAME |
> |
IS |
USERNAME |
>= |
ISANCESTOR |
VALIDMEASURE |
unary minus |
ISEMPTY |
VALUE |
NOT |
ISLEAF |
|
AND |
ISSIBLING |
|
Hinweis |
---|
Für jede benutzerdefinierte gespeicherte Prozedur, die entweder als COM oder verwalteter Code vorliegt, wird im Vergleich zu SQL Server 2005 Analysis Services (SSAS) keine Verbesserung der Leistung erreicht. Weitere Informationen finden Sie im Abschnitt zu den benutzerdefinierten gespeicherten Prozeduren (COM oder .NET) weiter oben in diesem Dokument. Konstante Ausdrücke, sowohl in literaler als auch in numerischer Form, profitieren von den Leistungsverbesserungen. |
Elementfunktionen
Die folgende Liste von Elementfunktionen enthält die Funktionen, von denen eine verbesserte Leistung erwartet werden kann.
.CurrentMember |
.FirstSibling |
.LastSibling |
.DataMember |
.Item |
.Lead |
.DefaultMember |
.Lag |
.Parent |
.FirstChild |
.LastChild |
.UnknownMember |
Ancestor |
KPIStatus |
NextMember |
Ancestors |
KPITrend |
OpeningPeriod |
Ascendants |
KPIValue |
ParallelPeriod |
ClosingPeriod |
KPIWeight |
PrevMember |
Cousin |
LastPeriods |
StrToMember(<String Expression>, CONSTRAINED) |
KPIGoal |
LinkMember |
|
Hinweis |
---|
StrToMember(<String Expression>, CONSTRAINED) erzielt die bestmögliche Leistung, wenn <String Expression> ein statischer Ausdruck ist. |
Mengenfunktionen
Die folgende Liste von Mengenfunktionen enthält die Funktionen, von denen eine verbesserte Leistung erwartet werden kann.
Aggregate |
Max |
Sum |
Avg |
Min |
|
Wenn Sie eine der aufgeführten Funktionen verwenden, muss der erste Parameter jedoch einen Ausdruck darstellen, der auf einer beliebigen Kombination der folgenden Funktionen basiert.
- (Except-Operator) |
.Children |
MTD |
(<set expression>,(<set expression>, …,(<set expression>) (Cross Join-Operator) |
.Members |
PeriodsToDate |
* (Cross Join-Operator) |
.Siblings |
QTD |
: (Bereichsoperator) |
AddCalculatedMembers |
StrToSet(<String Expression>, CONSTRAINED) |
+ (Vereinigungsoperator) |
Crossjoin(<set expression>,(<set expression>, …,(<set expression>) |
Tail |
|
Descendants |
Union |
|
Distinct |
Unorder |
|
Except |
WTD |
|
Hierarchize |
YTD |
|
Intersect |
|
Hinweis |
---|
Statische Mengen, einschließlich leerer Mengen, profitieren ebenfalls von den erwarteten Leistungsverbesserungen. |
VBA-Funktionen
Die folgende Liste von VBA-Funktionen enthält die Funktionen, von denen eine verbesserte Leistung erwartet werden kann.
Abs |
ZLong |
Länge |
ZDate |
ZString |
Jetzt |
ZDouble |
Int |
Rechts |
ZInteger |
Links |
Round |
Für die folgenden VBA-Funktionen ist eine verbesserte Leistung zu erwarten, wenn die Funktion über veränderliche Attribute ausgewertet wird.
Asc |
Format |
Vorzchn |
AscW |
ZW |
Sin |
ArcTan |
Hex |
LIA |
ZBool |
Hour |
LeerZchn |
ZByte |
ZINSZ |
QWurzel |
ZCurrrency |
Kleinbst |
Str |
ZDec |
Protokoll (Log) |
StrVgl |
Zchn |
LGlätten |
StrKonv |
ChrW |
Minute |
String |
Cos |
Monat |
DIA |
ZSingle |
ZZR |
Tan |
ZVariant |
Oktal |
Zeitgeber |
Datum |
Partition |
ZeitSeriell |
DateAdd |
RMZ |
ZeitSeriellStr |
DateDiff |
KAPZ |
Glätten |
DatTeil |
BW |
TypName |
DatSeriell |
Farbe |
Großbst |
DatWert |
ZINS |
Wert |
Day |
RGB |
Arbeitstag |
GDA |
ZZG |
Year |
Exponential |
RGlätten |
|
Fix |
Sekunde |
|