2014-02-17 4 views
1

배경 : 저는 MDX를 조금 사용해 왔지만 전문가가 아니기 때문에 성능에 대한 도움이 필요하지 않습니다. SQL Server Analysis Services 2012 큐브에서 계산 된 "MDX (Number of Stores Authorized/In-Stock/Selling/Etc)"측정 값 세트로 작업하고 있습니다. 이 계산은 원래 잘 수행되었지만 필자가 필요로하는 방식으로 제품 계층 구조 전반에 걸쳐 집계되지 않았 음을 알았습니다. 이 보고서에서 주로 사용되는 두 가지 계층 구조는 비즈니스 -> 항목 및 부문 -> 스토어입니다.MDX - 필터링 된 개수 CROSSJOIN - 성능 관련 문제

예를 들어, 원래 MDX 계산에서 상점 재고량 측정 값은 "항목"레벨에서 올바르게 수행되지만 위의 "비즈니스"레벨로 적절한 합계를 롤백하지는 않습니다. 비즈니스 수준에서 원래 매장으로 보였던 상점/제품 조합의 총 수를 보려고합니다. 고유하거나 MAX 값이 아닙니다.

원래 쿼리의 결과 :

[FILTER: CURRENT WEEK DAYS] 
[BUSINESS]   [AUTH. STORES] [STORES IN-STOCK] [% OF STORES IN STOCK] 
[+] Business One 2,416   2,392    99.01% 
[-] Business Two 2,377   2,108    93.39% 
    -Item 1   2,242   2,094    99.43% 
    -Item 2   2,234   1,878    84.06% 
    -Item 3   2,377   2,108    88.68% 
    -Item N   ...    ...     ... 

고정 쿼리 결과 : 여기 (이 엑셀 피벗 테이블 상상) 제대로 작동 하지 그것의 예 많은 시행 착오 후, I (아래) 올바른 숫자를 산출 한 DESCENDANTS() 함수를 사용하여 두 계층 구조의 CROSSJOIN() 필터링 된 카운트를 사용하여 전환 :

[FILTER: CURRENT WEEK DAYS] 
[BUSINESS]   [AUTH. STORES] [STORES IN-STOCK] [% OF STORES IN STOCK] 
[+] Business One 215,644   149,301    93.90% 
[-] Business Two 86,898   55,532    83.02% 
    -Item 1   2,242   2,094    99.43% 
    -Item 2   2,234   1,878    99.31% 
    -Item 3   2,377   2,108    99.11% 
    -Item N   ...    ...     ... 
HELP NEEDS 617,451,515,

QUERY :

CREATE MEMBER CURRENTCUBE.[Measures].[Num Stores In-Stock] 
AS COUNT(
    FILTER(
     CROSSJOIN(
      DESCENDANTS(
       [Product].[Item].CURRENTMEMBER, 
       [Product].[Item].[UPC]   
      ), 
      DESCENDANTS(
       [Division].[Store].CURRENTMEMBER, 
       [Division].[Store].[Store ID]  
      ) 
     ), 
     [Measures].[Inventory Qty] > 0 
    ) 
), 
FORMAT_STRING = "#,#", 
NON_EMPTY_BEHAVIOR = { [Inventory Qty] }, 

이 쿼리 구문이 다른 "상점의 수는 판매/재고 부족/기타의 무리에 사용됩니다 여기에 위의 결과를 얻을 수"새로운 "쿼리입니다 . "- 계산 된 측정 값을 큐브에 입력하고 하단의 [재고 수량] 조건을 변경하거나 추가 조건을 연결합니다.

이 쿼리는 실행하는 데 2-3 분이 걸릴 수 있습니다.이 쿼리는이보고 대상 사용자에게 너무 길기 때문에 누구든지 쿼리로드를 줄이거 나 더 효율적으로 재 작성하는 방법을 생각할 수 있습니까?

감사합니다.


UPDATE 2014년 2월 24일 : 우리는 관련된 MDX를 많이 무시하고, DSV 우리라는 이름의 쿼리에 플래그 값을 추가하여이 문제를 해결했다. 우리는 단순히 쿼리라는 사실 테이블이 추가 ...

CASE WHEN [Sales Qty] > 0 
    THEN 1 
    ELSE NULL 
END AS [Flag_Selling] 

... 우리는 - 대신에 "판매하는 매장의 수"에 대한 MDX 코드에서 필터 명령을 수행하는 예를 들어

, 큐브에서 LastNonEmpty로 이러한 측정 값을 단순히 집계했습니다. 전체 MDX 쿼리보다 훨씬 빠르게 롤 업합니다.

답변

1

느린 Filter 기능 피하고, 큐브로 조건을 모델링 훨씬 더 빨리해야한다 : 조건의 단지 소수가있는 경우,

을 조건에 대해 두 개의 값으로 그들 각각에 대해 하나를 속성을 추가 성취 : "cond : 예"라고 말하면서, 조건이 충족되지 않으면 "cond : 아니오"라고 말하십시오. 물리적 팩트 테이블 또는 DSV의 뷰에서이를 정의하거나 물리적으로 모델링 할 수 있습니다.이러한 속성을 팩트 테이블에 직접 추가하여 동일한 테이블에 차원을 정의하거나 팩트 테이블에서 참조하는 별도의 차원 테이블로 더 명확하게 추가 할 수 있습니다. 그런 다음 측정 값을

CREATE MEMBER CURRENTCUBE.[Measures].[Num Stores In-Stock] 
AS COUNT(
    CROSSJOIN(
     DESCENDANTS(
      [Product].[Item].CURRENTMEMBER, 
      [Product].[Item].[UPC]   
     ), 
     DESCENDANTS(
      [Division].[Store].CURRENTMEMBER, 
      [Division].[Store].[Store ID]  
     ), 
     { [Flag dim].[cond].[cond: yes] } 

    ) 
) 

으로 정의 할 수 있습니다. 아마도 계수를 사실 테이블의 표준 계수로 지정할 수도 있습니다.

많은 조건이있는 경우 각 조건에 대해 하나의 값을 가진 단일 속성을 다 대다 관계로 추가하는 것이 좋습니다. 약간 느리지 만 Filter 호출보다 빠릅니다.

+0

이 데이터도 시간에 따라 바인딩되므로 차원에 특성을 추가해도 반드시 작동하지는 않습니다 ... 그러나 필자는 언급 한 것처럼 DSV의 사실 테이블에 대한 이진 플래그를 생각했습니다. 나는 그것을 시도하고 다시보고 할 것입니다. –

+0

추천대로 큐브에 조건을 모델링 했으므로 작업 속도가 약 5 배 빨라졌습니다. 우리가 MDX로 ​​너무 멋지게하려고 노력하고 있었던 것을 생각해라! –

1

크로스 필터는 물론 필터를 완전히 피할 수 있다고 생각합니다. 이것을 사용 해보십시오 :

내 큐브의 차원을 사용하고 Area-Subsidiary 계층을 사용하여 시도했습니다. case 문은 비즈니스 수준에서 데이터를 보는 상황을 처리합니다. 기본적으로 은 CASE에서 사용 된 항목 이름의 모든 구성원에 걸쳐 개별 항목 이름에 대한 값을 계산 한 다음 모든 값을 합산합니다. 나는 이것이 당신이 필요로하는 것이라고 믿습니다.