다음을 통해 공유


통과 순서 및 해결 순서 이해 (MDX)

MDX 스크립트의 결과로 계산되는 큐브는 다양한 계산 관련 기능의 사용에 따라 여러 계산 단계를 거치게 됩니다. 이러한 각 단계를 계산 패스라고 합니다.

계산 패스는 계산 패스 번호라고 하는 서수 위치로 참조할 수 있습니다. 큐브의 모든 셀을 완전히 계산하는 데 필요한 계산 패스 수를 큐브의 계산 통과 깊이라고 합니다.

팩트 테이블 및 쓰기 저장 데이터는 통과 0에만 영향을 미칩니다. 스크립트는 0을 통과한 후 데이터를 채웁니다. 스크립트의 각 할당 및 calculate 문은 새 패스를 만듭니다. MDX 스크립트 외부에서 절대 패스 0에 대한 참조는 큐브에 대한 스크립트에서 만든 마지막 패스를 참조합니다.

계산 멤버는 모든 패스에서 생성되지만 식은 현재 패스에 적용됩니다. 이전 패스에는 계산된 측정값이 포함되어 있지만 null 값으로 표시됩니다.

순서 해결

계산 순서는 경쟁 식의 경우 계산의 우선 순위를 결정합니다. 단일 패스 내에서 해결 순서는 다음 두 가지를 결정합니다.

  • Microsoft SQL Server Analysis Services가 차원, 멤버, 계산된 멤버, 사용자 지정 롤업 및 계산된 셀을 평가하는 순서입니다.

  • Analysis Services에서 사용자 정의 멤버, 계산된 멤버, 사용자 정의 롤업, 계산된 셀의 계산 순서입니다.

해결 순서가 가장 높은 멤버가 우선합니다.

비고

이 우선 순위에 대한 예외는 Aggregate 함수입니다. Aggregate 함수를 사용하는 계산 멤버는 교차하는 계산된 측정값보다 해결 순서가 낮습니다.

순서 값 및 우선 순위를 해결하기

해결 순서 값은 -8181 범위에서 65535까지 다양할 수 있습니다. 이 범위에서 일부 계산 순서 값은 다음 표와 같이 특정 종류의 계산에 해당합니다.

계산 순서 풀기
사용자 지정 멤버 수식 -5119
단항 연산자 -5119
시각적 합계 계산 -4096
다른 모든 계산(달리 지정되지 않은 경우) 0

해지 순서 값을 설정할 때는 양의 정수만 사용하는 것이 좋습니다. 이전 표에 표시된 계산 순서 값보다 낮은 값을 할당하면 계산 패스를 예측할 수 없게 될 수 있습니다. 예를 들어 계산 멤버에 대한 계산은 기본 사용자 지정 롤업 수식 값 -5119보다 낮은 계산 순서 값을 받습니다. 이러한 낮은 해결 순서 값으로 인해 계산 멤버가 사용자 지정 롤업 수식 전에 계산되고 잘못된 결과가 생성될 수 있습니다.

해결 순서 만들기 및 변경

큐브 디자이너의 계산 창에서 계산 멤버와 계산 셀의 계산 순서를 변경하여 계산 순서를 조정할 수 있습니다.

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가 하나만 있습니다. 계산 멤버가 하나뿐이므로 큐브에서 계산 멤버를 사용하지 않는 한 계산 순서는 문제가 되지 않습니다.

이 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

지출 후 소득의 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%

첫 번째 쿼리와 두 번째 쿼리 간의 결과 집합 차이는 계산 멤버의 배치 차이에서 비롯됩니다. 첫 번째 쿼리에서 계산 멤버는 두 번째 쿼리에 표시된 COLUMNS 축이 아니라 ROWS 축의 일부입니다. 이러한 배치 차이는 단일 MDX 쿼리에서 두 개의 계산 멤버를 결합하는 다음 쿼리에서 중요해집니다.

쿼리 3-결합 연도 차이 및 당기순이익 계산

앞의 두 예제를 모두 단일 MDX 쿼리로 결합하는 이 최종 쿼리에서는 열과 행 모두에 대한 계산으로 인해 해결 순서가 중요해집니다. 계산이 올바른 순서로 수행되도록 하려면 키워드를 사용하여 SOLVE_ORDER 계산이 수행되는 시퀀스를 정의합니다.

SOLVE_ORDER 키워드를 사용하면 MDX 쿼리 또는 CREATE MEMBER 명령에서 계산 멤버의 해결 순서를 지정할 수 있습니다. 키워드와 함께 SOLVE_ORDER 사용되는 정수 값은 상대 값이며, 0에서 시작할 필요가 없으며 연속될 필요가 없습니다. 값은 단순히 더 높은 값을 가진 멤버를 계산하여 파생된 값을 기반으로 멤버를 계산하도록 MDX에 지시합니다. 계산 멤버가 키워드 없이 SOLVE_ORDER 정의된 경우 해당 계산 멤버의 기본값은 0입니다.

예를 들어 처음 두 개의 예제 쿼리에 사용된 계산을 결합하면 두 개의 계산 멤버 Year DifferenceProfit MarginMDX 쿼리 예제의 결과 데이터 세트에 있는 단일 셀에 교차합니다. 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  

추가 고려 사항

특히 계산 멤버, 사용자 지정 롤업 수식 또는 계산 셀과 관련된 차원이 많은 큐브에서 순서를 해결하는 것은 매우 복잡한 문제일 수 있습니다. Analysis Services가 MDX 쿼리를 평가할 때 Analysis Services는 MDX 쿼리에 지정된 큐브의 차원을 포함하여 주어진 패스 안에서 포함된 모든 항목의 해결 순서 값을 검토합니다.

또한 참조하십시오

CalculationCurrentPass(MDX)
CalculationPassValue(MDX)
CREATE MEMBER 문(MDX)
데이터 조작(MDX)