共用方式為


SQL Server 2008 Analysis Services 中 MDX 的效能改進

在這個 Analysis Services 版本中,我們特別強調改善多維度運算式 (MDX) 計算的執行效能。為了達到這些效能提升,我們已經對引擎架構進行許多重要變更。不過,若要善用這些效能改進,您必須最佳化 MDX 程式碼。

此文件將協助您了解現有 MDX 程式碼中哪些位置可能會發生問題,而讓您無法體驗效能改進,並提供如何在全新 MDX 編碼中避免這些問題的相關建議。此外,這份文件也包含從效能改進中獲益的函數清單。

檢閱您的程式碼以便在 MDX 中取得最大效能提升

檢閱程式碼時,請嘗試避免下列各組案例或編碼情況,因為它們可能會讓您的 MDX 陳述式無法達到從 SQL Server 2008 Analysis Services (SSAS) 開始實作的效能提升。不過,如果沒有任何可行的方式可變更程式碼來避免所列的情況,您可以預期 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 沒有加入任何變化屬性,因為它以 1:1 的關聯性繫結至 currentmember。因此,系統只會針對每個客戶評估 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 運算式時,您的程式碼正在變更即將加總的成員。另一個範例是,您需要使用 Calendar Year 的成員或 Fiscal Year 階層的成員,而這些階層仰賴屬於 Account 屬性目前成員的屬性,以便與平行週期的對等值進行比較。這個案例所需的 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() 運算式之前,沒有任何方式可得知產生的 Tuple。不過,在下列對等的運算式中

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

評估運算式 e 之前,就已經得知了產生的 Tuple。

使用者定義的預存程序 (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

 

[!附註]

與 SQL Server 2005 Analysis Services (SSAS) 比較時,COM 或 Managed 程式碼中的任何使用者定義預存程序將不會產生任何效能改進。如需詳細資訊,請參閱這份文件前面的「使用者定義的預存程序 (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

 

[!附註]

當 <String Expression> 是靜態運算式時,StrToMember(<String Expression>, CONSTRAINED) 會取得最佳效能。

集合函數

下列集合函數的清單包含您應該預期會看見改善效能的函數。

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