共用方式為


了解傳遞順序和求解順序(MDX)

當一個立方體作為 MDX 腳本的計算結果時,它可能會經歷多個計算階段,這取決於各種計算相關功能的使用。 每個這些階段被稱為計算通過。

計算階段可以透過序數位置來參考,稱為計算階段數。 計算出立方體中所有單元所需的計算遍次次數,稱為立方體的計算遍次深度。

事實表和寫回數據只會影響階段 0。 腳本會在傳遞 0 之後填入數據;腳本中的每個指派和計算語句都會建立新的傳遞。 在 MDX 腳本之外,「絕對通道 0」指的是該腳本為 cube 建立的最後一個通道。

計算成員在所有運算階段中建立,但表達式則應用於當前的運算階段。 先前的運算階段包含計算後的量值,但其值為空。

解決順序

解決順序會決定競爭表達式時計算的優先順序。 在單一階段內,解決順序會決定兩件事:

  • MICROSOFT SQL Server Analysis Services 評估維度、成員、計算成員、自定義匯總與計算單元格的順序。

  • Analysis Services 計算自定義成員、計算成員、自定義匯總和計算單元格的順序。

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

備註

此優先順序的例外狀況是 Aggregate 函式。 使用 Aggregate 函數的計算成員的求解順序低於任何交叉計算的度量值。

解決順序值和優先順序

解決順序值的範圍可以從 -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
年差 (20,160.56美元) $2,878.06

查詢扣除費用後收入的百分之二

針對第二個查詢,使用下列 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 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 公式來評估所涉及的儲存格。 這個巢狀計算的結果,如下表所示。

因特網銷售金額 因特網產品總成本 獲利率
CY 2007 $9,791,060.30 $5,718,327.17 41.60%
CY 2008 $9,770,899.74 $5,721,205.24 41.45%
年差 (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%
年差 (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   

0.4145 - 0.4160= -0.15  

其他考慮

處理解決順序的問題可能非常複雜,特別是在有大量維度且涉及計算成員、自訂彙總公式或計算單元格的 Cube 中。 當 Analysis Services 評估 MDX 查詢時,Analysis Services 會考慮在指定執行階段內所有相關專案的求解順序值,包括 MDX 查詢中指定的多維資料集維度。

另請參閱

CalculationCurrentPass (MDX)
CalculationPassValue (MDX)
CREATE MEMBER 語法 (MDX)
資料操作(MDX)