共用方式為


了解行程順序與解決順序 (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 Multidimensional Models SQL Server 2012 (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 查詢產生類似下表的結果集。

Internet Sales Amount Internet Total Product Cost
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 查詢產生類似下表,但有些微差異的結果集。

Internet Sales Amount Internet Total Product Cost 獲利率
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 DifferenceProfit 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 公式來評估有問題的儲存格。 此巢狀計算的結果,如下表所示。

Internet Sales Amount Internet Total Product Cost 獲利率
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 使用公式來評估資料格,如下表所示。

Internet Sales Amount Internet Total Product Cost 獲利率
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%)

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

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

Or

0.4145 - 0.4160= -0.15  

其他考量

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

另請參閱

CalculationCurrentPass (MDX)
CalculationPassValue (MDX)
CREATE MEMBER 陳述式 (MDX)
操作資料 (MDX)