SQL Server 2008 Analysis Services의 MDX 성능 향상

이 버전의 Analysis Services에서는 MDX(Multidimensional Expressions) 계산 실행의 성능을 개선하는 데 특별히 중점을 두었습니다. 이러한 성능 향상을 위해 엔진 아키텍처에 여러 가지 중요한 변경이 이루어졌습니다. 단, 이러한 성능 향상을 활용하기 위해서는 MDX 코드를 최적화해야 합니다.

이 문서는 기존 MDX 코드에서 성능 향상을 저해하는 문제가 발생하는 지점을 파악할 수 있도록 돕고, 새 MDX 코딩에서 이러한 문제를 피하는 방법에 대한 조언을 제공합니다. 또한 이 문서에는 성능 향상 효과를 얻을 수 있는 함수 목록도 포함되어 있습니다.

MDX의 성능 향상 극대화를 위한 코드 검토

코드를 검토할 때 다음과 같이 SQL Server 2008 Analysis Services(SSAS) 버전 이상에서 구현되는 MDX 문의 성능 향상을 저해할 수 있는 일련의 시나리오나 코딩 상황은 피하도록 하십시오. 나열된 상황을 피하도록 코드를 변경할 실질적인 방법이 없는 경우 MDX 코드의 성능 수준은 SQL Server 2005 Analysis Services(SSAS)에서와 동일하다고 간주하면 됩니다.

유용한 정의

공간

식이 계산되는 셀 집합입니다.

임의 셰이프

두 개 이상 집합의 상호 조인으로 표현할 수 없는 공간입니다. 예를 들어 공간 {(Drink, USA), (Food, Canada)}는 {Drink, Food} * {USA, Canada} = {(Drink, USA), (Drink, Canada), (Food, USA), (Food, Canada)} 간 상호 조인의 하위 집합이므로 임의 셰이프를 나타냅니다.

정적 식

계산되는 공간에서 식이 변하지 않을 때 해당 식을 정적이라고 합니다.

예를 들어 CrossJoin(Product.Members, Customer.Members) 공간에서 다음 식은 변하지 않습니다.

  • 1, 상수 식

  • Product.Members.Count

동적 식

계산되는 공간에서 식이 각 셀에 대해 다른 값으로 환원될 때 해당 식을 동적이라고 합니다.

예를 들어 CrossJoin(Product.Members, Customer.Members) 공간에서 다음 식은 동적입니다.

  • Sales(Sales는 측정값이므로 공간의 각 셀마다 값이 다르기 때문임)

가변 특성

가변 특성이 있으면 해당 특성에 식이 종속되도록 계산이 이루어집니다. 예를 들어 Customer.Geography.CurrentMember 식은 지역 계층의 특성에 종속됩니다.

일반적으로 가변 특성은 식이 계산되는 공간을 축소합니다. 다음 식을 참조하십시오.

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

이 식에서 Customers.Geography는 정적 식입니다. currentmember 함수는 City 특성에 종속성을 부여하므로 가변 특성입니다. Uniquename은 currentmember와 1:1 관계로 묶이므로 가변 특성을 추가하지 않습니다. 따라서 uniquename은 각 고객에 대해 한 번만 계산되며 각 Product에 대해 반복되지 않습니다. 따라서 전체 식 공간은 가변 특성을 통해 사실상 축소됩니다.

값이 아닌 셀 속성에서 식 사용

값이 아닌 셀 속성 값을 할당하는 데 사용되는 MDX 식은 성능 향상의 효과를 얻지 못합니다. 성능은 SQL Server 2005 Analysis Services(SSAS)와 같은 수준으로 유지됩니다.

목록에 없는 함수의 사용

MDX 코드에 사용된, 이 문서에 포함되지 않은 함수는 이 버전의 제품에서 제공하는 성능 향상의 효과를 얻지 못합니다. 이 문서의 Functions with enhanced performance 부분을 참조하십시오.

셀 보안 사용

셀 보안이 정의된 공간에서 MDX 식을 계산하는 경우 코드에서 성능 향상의 효과를 얻을 수 없습니다.

셀 보안과 성능 간의 관계는 다음 표에 정리되어 있습니다.

셀 보안

예상 성능

없음

가장 높음

읽기

중간

불확정 읽기

가장 낮음

MDX 식을 사용하여 셀 데이터 권한 설정셀 데이터에 사용자 지정 액세스 부여를 참조하십시오.

동적 차원 사용

MDX 코드에 동적 차원 식을 사용하는 경우 코드에서 성능 향상의 효과를 얻을 수 없습니다. 예를 들어 Sum( IIF( Sales > 10000, h1.Members, h2.Members))와 같은 식은 Sales 식이 계산되면서 코드에서 합산되는 멤버가 변경되므로 성능 향상을 얻지 못합니다. 다른 예로는 병렬 기간의 동등한 값 비교를 위해 Account 특성의 현재 멤버에 속한 특성에 의존하는 Calendar Year의 멤버, 또는 Fiscal Year 계층의 멤버 중 하나를 사용해야 하는 시나리오가 있습니다. 이러한 시나리오에 필요한 MDX 식은 다음 예제 코드와 유사합니다.

ParallelPeriod(Iif( Account.CurrentMember.Properties("UsesFiscalCalendar")="Y", FiscalTime, CalendarTime).CurrentMember)

역시 Account 차원의 현재 멤버가 변경됨에 따라 차원도 동적으로 변경됩니다.

동적 매개 변수 사용

MDX 코드에 동적 매개 변수를 사용하는 경우 코드에서 성능 향상의 효과를 얻을 수 없습니다. 예를 들어 KpiGoal("Sales_" & [Fiscal Year].currentmember.UniqueName)과 같은 식은 계산되는 셀에 따라 변경되는 반면 KpiGoal("Sales_" & Cstr(Year(Now))) 식은 변경되지 않습니다.

중요 정보중요

KpiGoal("Sales_" & [Fiscal Year].currentmember.UniqueName) 식이 계산 공간에서 동일한 값으로 계산될 수도 있습니다. 그러나 이것만으로는 엔진이 예상되는 성능 향상을 제공하기에 부족할 수 있습니다.

동적 멤버 참조

MDX 코드에 동적 멤버 참조를 사용하는 경우 코드에서 성능 향상의 효과를 얻을 수 없습니다. 예를 들어 다음 식을 살펴보겠습니다.

(IIF( e, mbr1, mbr2), Sales)

이 경우 실행 시 IIF() 식이 계산되기 전까지 결과 튜플을 알 방법이 없습니다. 이와 동등한 다음 식을 살펴보겠습니다.

IIF( e, (mbr1, Sales), (mbr1, Sales))

어느 쪽 결과 튜플이든 e 식이 계산되기 전에 알 수 있습니다.

사용자 정의 저장 프로시저(COM 또는 .NET)

MDX 코드에 사용자 정의 저장 프로시저를 사용하는 경우 코드에서 성능 향상의 효과를 얻을 수 없습니다.

[!참고]

Analysis Services는 성능 향상에 최적화된 저장 프로시저를 제공합니다.

매개 변수에 명명된 집합 또는 집합 별칭 사용

MDX 코드에서 명명된 집합이나 집합 별칭이 Sum, Min, Max, Avg, 또는 Aggregate 함수의 첫 번째 매개 변수로 사용되는 경우 코드에서 성능 향상의 효과를 얻지 못합니다.

예를 들어 다음 MDX 식은 자식이 둘 이상인 멤버의 수를 계산합니다.

Sum(h.members as S, Iif(S.Current.Children.Count > 1, 1, 0))

h.members의 별칭은 S가 되고, 나중에 Current 함수 값은 별칭이 지정된 집합에서 가져오므로 성능 향상 효과를 얻지 못하게 됩니다.

다음 코드는 이러한 상황이 발생하는 또 다른 일반적인 예를 보여 줍니다.

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]

멤버 정의의 SUM 함수는 명명된 집합을 기반으로 하므로 예상되는 성능 향상을 얻지 못합니다.

사용자 지정 롤업 식에서 런타임 바인딩 사용

사용자 지정 롤업 식이 계산된 멤버, 또는 실행 시 계산되는 다른 MDX 식을 참조하는 경우 해당 사용자 지정 롤업 식은 성능 향상을 차단합니다.

스크립트에서 전방 참조 사용

MDX 코드에서 별도의 문에 전방 정의 참조를 작성하는 경우 코드에서 성능 향상의 효과를 얻지 못합니다. 예를 들어 다음 MDX 스크립트 조각에서는 X 정의 동안 Y에서 전방 참조가 생성됩니다.

Create Member X as Y * 2;

Create Member Y as ( Sales, [Date].[Calendar].[Month].PreviousMember);

이러한 문제를 해결하려면 다음 스크립트 조각에서와 같이 Y 정의를 X 정의 앞에 배치해야 합니다.

Create Member Y as ( Sales, [Date].[Calendar].[Month].PreviousMember);

Create Member X as Y * 2;

향상된 성능의 함수

스칼라 함수

다음 스칼라 함수 목록에는 성능 향상을 기대할 수 있는 함수가 포함되어 있습니다. 목록의 첫 번째 열에는 스칼라 연산자가 있습니다.

-

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

 

[!참고]

COM 또는 관리 코드의 모든 사용자 정의 저장 프로시저는 SQL Server 2005 Analysis Services(SSAS)에 비해 아무런 성능 향상도 얻지 못합니다. 자세한 내용은 이 문서의 앞부분에 있는 사용자 정의 저장 프로시저(COM 또는 .Net)를 참조하십시오. 상수 식은 리터럴, 숫자에 관계없이 성능 향상 효과를 얻을 수 있습니다.

멤버 함수

다음 멤버 함수 목록에는 성능 향상을 기대할 수 있는 함수가 포함되어 있습니다.

.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

 

[!참고]

StrToMember(<String Expression>, CONSTRAINED)는 <String Expression>이 정적 식일 때 가능한 최상의 성능을 얻습니다.

집합 함수

다음 집합 함수 목록에는 성능 향상을 기대할 수 있는 함수가 포함되어 있습니다.

Aggregate

Max

Sum

Avg

Min

 

단, 목록의 함수를 사용하는 경우 첫 번째 매개 변수는 다음 함수들의 조합을 사용하는 식이어야 합니다.

-(제외 연산자)

.Children

MTD

(<set expression>,(<set expression>, ,(<set expression>)(상호 조인 연산자)

.Members

PeriodsToDate

*(상호 조인 연산자)

.Siblings

QTD

:(범위 연산자)

AddCalculatedMembers

StrToSet(<String Expression>, CONSTRAINED)

+(합집합 연산자)

Crossjoin(<set expression>,(<set expression>, …,(<set expression>)

Tail

 

Descendants

Union

 

Distinct

Unorder

 

Except

WTD

 

Hierarchize

YTD

 

Intersect

 

[!참고]

빈 집합을 포함한 정적 집합도 예상되는 성능 향상 효과를 얻을 수 있습니다.

VBA 함수

다음 VBA 함수 목록에는 성능 향상을 기대할 수 있는 함수가 포함되어 있습니다.

Abs

CLng

Len

CDate

CStr

Now

CDbl

Int

Right

CInt

Left

Round

다음 VBA 함수는 함수가 가변 특성에 대해 계산되는 경우 성능 향상을 기대할 수 있습니다.

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