了解行程順序與解決順序 (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 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
公式來評估有問題的儲存格。 此巢狀計算的結果,如下表所示。
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)