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 andernfalls nicht die ab SQL Server 2008 Analysis Services (SSAS) implementierten 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 Cross Join 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 Cross Joins 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.

Wichtiger HinweisWichtig

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.

Benutzerdefinierte gespeicherte Funktionen (COM oder .NET)

Die Verwendung benutzerdefinierter gespeicherter Prozeduren im MDX-Code verhindert eine Verbesserung der Leistung.

HinweisHinweis

Analysis Services 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

 

HinweisHinweis

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

 

HinweisHinweis

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

 

HinweisHinweis

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

CLng

Len

CDate

CStr

Now

CDbl

Int

Right

CInt

Left

Round

Für die folgenden VBA-Funktionen ist eine verbesserte Leistung zu erwarten, wenn die Funktion über veränderliche Attribute ausgewertet wird.

Asc

Format

Sgn

AscW

FV

Sin

Atn

Hex

SLN

Cbool

Hour

Space

Cbyte

Ipmt

Sqr

Ccur

Lcase

Str

Cdec

Log

StrComp

Chr

Ltrim

StrConv

ChrW

Minute

String

Cos

Month

SYD

CSng

Nper

Tan

Cvar

Oct

Timer

Date

Partition

TimeSerial

DateAdd

Pmt

TimeValue

DateDiff

PPmt

Trim

DatePart

PV

TypeName

DateSerial

QBColor

Ucase

DateValue

Rate

Val

Day

RBG

Weekday

DDB

Rnd

Year

Exp

Rtrim

 

Fix

Second