共用方式為


了解行程順序與解決順序 (MDX)

當 Cube 做為 MDX 指令碼的計算結果時,Cube 會根據所使用的各種計算相關功能來進行多個計算階段。 每個階段都稱為一個計算行程。

計算行程可以是序數位置,稱為計算行程數目。 完整計算 Cube 中所有資料格所需的計算行程數目稱為 Cube 的計算行程深度。

事實資料表和回寫資料只會影響行程 0。 行程 0 之後,指令碼會擴展資料;指令碼中每個指派和計算陳述式都會建立新的行程。 在 MDX 指令碼之外,對絕對行程 0 的參考會參考指令碼為 Cube 所建立的最後行程。

導出成員會在所有行程建立,但運算式只會在目前行程套用。 先前的行程包含導出量值,不過會是 Null 值。

解決順序

解決順序決定在運算式發生競爭事件時,計算的優先權。 在單一行程內,解決順序決定兩件事情:

  • Microsoft SQL Server Analysis Services 評估維度、成員、導出成員、自訂積存和導出資料格的順序。

  • Analysis Services 評估自訂成員、導出成員、自訂積存和導出資料格的順序。

擁有最高解決順序的成員優先。

[!附註]

此優先順序的例外狀況是彙總函式。 具有彙總函式的導出成員,其解決順序比任何交集的導出量值還低。

解決順序值和優先順序

解決順序值的範圍可以從 -8181 到 65535。 在此範圍中,某些解決順序值是對應到特定的計算種類,如下表所示。

計算

解決順序

自訂成員公式

-5119

一元運算子

-5119

視覺化總計計算

-4096

其他所有計算 (若沒有特別指定)

0

強烈建議您在設定解決順序值時只使用正整數。 如果您指定比上表中解決順序值還低的值,計算行程可能會變得無法預測。 例如,導出成員的計算會收到一個低於預設自訂積存公式值 -5119 的解決順序值。 這類低的解決順序值會造成導出成員的計算早於自訂積存公式,所以會產生不正確的結果。

建立與變更解決順序

在 [Cube 設計師] 的 [計算窗格] 上,您可以變更計算的順序,來變更導出成員和導出資料格的解決順序。

在 MDX 中,您可以使用 SOLVE_ORDER 關鍵字來建立或變更導出成員與導出資料格。

解決順序範例

為了方便說明解決順序的可能複雜性,下列 MDX 查詢以兩個查詢開始,而個別查詢沒有解決順序的問題。 當這兩個查詢結合成一個查詢時,就需要解決順序。

[!附註]

您可以針對 Adventure Works 範例多維度資料庫執行這些 MDX 查詢。 您可以從 codeplex 網站下載 AdventureWorks 多維度模型 SQL Server 2012 範例。

查詢 1—收益和費用的差異

在第一個 MDX 查詢中,建構一個簡單的 MDX 查詢來計算每年銷售和成本的差異,如以下範例所示:

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]

在此查詢中,只有一個導出成員 Year Difference。 因為只有一個導出成員,只要 Cube 不使用任何導出成員,就沒有解決順序的問題。

此 MDX 查詢產生類似下表的結果集。

網際網路銷售量

網際網路總產品成本

CY 2007

$9,791,060.30

$5,718,327.17

CY 2008

$9,770,899.74

$5,721,205.24

Year Difference

($20,160.56)

$2,878.06

查詢 2—扣除費用後的收益百分比

在第二個查詢中,使用以下 MDX 查詢來計算每年扣除費用後的收益百分比:

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]

此 MDX 查詢和前一個查詢類似,只有一個導出成員 Profit Margin,因此也沒有任何求解順序的問題。

此 MDX 查詢產生類似下表,但有些微差異的結果集。

網際網路銷售量

網際網路總產品成本

獲利率

CY 2007

$9,791,060.30

$5,718,327.17

41.60%

CY 2008

$9,770,899.74

$5,721,205.24

41.45%

第一個查詢和第二個查詢之間的結果集差異,在於導出成員的位置差異。 在第一個查詢中,導出成員是 ROWS 座標軸的一部份,而不是第二個查詢中的 COLUMNS 座標軸。 此種位置的差異在下一個查詢 (結合單一 MDX 查詢的兩個導出成員) 中就變得很重要。

查詢 3—結合年度差異和淨收益的計算

在結合上述兩個範例到單一 MDX 查詢的最終查詢中,求解順序就變得很重要,因為會同時計算資料行和資料列。 若要確定以正確的順序進行計算,請使用 SOLVE_ORDER 關鍵字定義計算順序。

SOLVE_ORDER 關鍵字指定 MDX 查詢中導出成員或 CREATE MEMBER 命令的解決順序。 和 SOLVE_ORDER 關鍵字並用的整數值是相對值,不需要從零開始,也不需要連續。 此數值只是告知 MDX 根據有較高值的成員計算所得出的值來導出成員。 如果導出成員沒有以 SOLVE_ORDER 關鍵字定義,該導出成員的預設值為零。

例如,如果您結合前兩個範例查詢中使用的計算,兩個導出成員 Year Difference 和 Profit Margin 會在 MDX 查詢範例之結果資料集中的單一資料格中產生交集。 決定 Analysis Services 如何評估此資料格的唯一方式,就是解決順序。 用來建立此資料格的公式會根據兩個導出成員的解決順序,來產生不同的結果。

首先,請嘗試結合以下 MDX 查詢中前兩個查詢所使用的計算:

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]

在此結合的 MDX 查詢範例中,Profit Margin 擁有最高的解決順序,所以當兩個運算式有交集時會優先處理它。 Analysis Services 會使用 Profit Margin 公式來評估有問題的資料格。 此巢狀計算的結果,如下表所示。

網際網路銷售量

網際網路總產品成本

獲利率

CY 2007

$9,791,060.30

$5,718,327.17

41.60%

CY 2008

$9,770,899.74

$5,721,205.24

41.45%

Year Difference

($20,160.56)

$2,878.06

114.28%

共用資料格中的結果是以 Profit Margin 的公式為基礎。 也就是說,Analysis Services 會計算含有 Year Difference 資料之共用資料格的結果,產生下列公式 (為了清楚起見,結果為四捨五入):

((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 

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

這明顯錯誤。 但是,如果您在 MDX 查詢中切換導出成員的求解順序,Analysis Services 會以不同方式計算共用資料格的結果。 以下結合的 MDX 查詢改變了導出成員的解決順序:

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]

當切換導出成員的求解順序後,Analysis Services 就會使用 Year Difference 公式來評估資料格,如下表所示。

網際網路銷售量

網際網路總產品成本

獲利率

CY 2007

$9,791,060.30

$5,718,327.17

41.60%

CY 2008

$9,770,899.74

$5,721,205.24

41.45%

Year Difference

($20,160.56)

$2,878.06

(0.15%)

因為此查詢使用含有 Profit Margin 資料的 Year Difference 公式,所以共用資料格的公式會類似以下計算:

(($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 

0.4145 - 0.4160= -0.15

其他考量

若 Cube 有大量的維度,並牽涉到導出成員、自訂積存公式或導出資料格時,處理解決順序會是非常複雜的問題。 當 Analysis Services 評估 MDX 查詢時,Analysis Services 會考慮給定行程內牽涉到的所有項目 (包括 MDX 查詢中指定之 Cube 的維度) 的解決順序值。

請參閱

參考

CalculationCurrentPass (MDX)

CalculationPassValue (MDX)

CREATE MEMBER 陳述式 (MDX)

其他資源

操作資料 (MDX)