2017-04-07 21 views
0

UserGroups 차원이 여러 계층으로 구성된 SSAS 다차원 큐브에서 작업. 각 계층 구조는 사용자를 특정 그룹에 속하는 것으로 분류합니다. 사용자는 둘 이상의 그룹에 속할 수 있습니다.공유 차원에서 계층 당 하나의 행에 대한 빠른 MDX 쿼리

차원의 각 계층에 대해 하나의 행이있는 테이블을 생성하려고 시도합니다.

WITH 

    MEMBER [Measures].[Group Name] AS 
     CASE 
      WHEN [UserGroups].[Group A].CurrentMember.MemberValue <> 'All' THEN "Group A" 
      WHEN [UserGroups].[Group B].CurrentMember.MemberValue <> 'All' THEN "Group B" 
      -- More user groups... 
      WHEN [UserGroups].[Group T].CurrentMember.MemberValue <> 'All' THEN "Group T" 
      ELSE "Error" 
     END 
SELECT 

{[Members].[Group Name], [Measures].[User Count], [Measures].[Revenue]} ON 0, 

Order(
    UNION(
     [UserGroups].[Group A].&[True] * 
     {[UserGroups].[Group B].[All]} * 
     -- More user groups... 
     {[UserGroups].[Group T].[All]}, 


     [UserGroups].[Group A].[All] * 
     {[UserGroups].[Group B].&[True]} * 
     -- More user groups... 
     {[UserGroups].[Group T].[All]}, 

     -- A bunch more blocks so that there is one for each row. 

     [UserGroups].[Group A].[All] * 
     {[UserGroups].[Group B].[All]} * 
     -- More user groups... 
     {[UserGroups].[Group T].&[True]} 
    ), 
) 
ON 1 

FROM [Finances]; 
이 예상되는 테이블을 생성에 성공

:

    Group Name User Count Revenue 
All All ... True Group T  90   1800 
... ... ... ... ...   ...   ... 
All True ... All Group B  20   400 
True All ... All Group A  10   100 

그러나 쿼리가 매우 느립니다 내가 함께 온 가장 좋은 방법은 다음과 같다. 주어진 행은 약 30 초 안에 분리되어 계산 될 수 있습니다. UNION 문을 사용하여 행을 결합 할 때, 각 추가 행은 계산 시간의 원하는 선형 증가보다 계산 시간이 기하 급수적으로 증가하는 것으로 보입니다.

  • 왜 이렇게 시간이 증가 했습니까?
  • 기본 엔진이 각 행을 독립적으로 계산하도록 지시하는 방법이 있습니까?
  • 이 쿼리를 실행하는 데 더 좋은 방법이 있습니까?
+0

놀라운 것은 각 행이 너무 느립니다. 사용자 수를 정규 SUM 측정 값입니까? 팩트 테이블은 몇 행입니까? Group A에 의한 User Count에 대한 간단한 쿼리를 수행했다면 그 셀 하나를 검색하는 데 얼마나 걸리나요? 수익은 어떨까요? 질문에 나오는 것 이외에 다른 계산법이 있습니까? – GregGalloway

+0

큐브를 변경할 위도가 있습니까? many - to - many UserGroup 차원은 의미가 있습니다. 그것이 옵션인지 알려주세요. – GregGalloway

답변

0

당신은 이미 쿼리를 다시 배열하는 것으로 생각합니다. SELECT에서 UNION (...)을 가져 와서 WITH 절에 명명 된 SET을 만들면 도움이됩니까?

WITH 
    SET [RowSet] AS 
     UNION(
     [UserGroups].[Group A].&[True] * 
     {[UserGroups].[Group B].[All]} * 
     -- More user groups... 
     {[UserGroups].[Group T].[All]}, 


     [UserGroups].[Group A].[All] * 
     {[UserGroups].[Group B].&[True]} * 
     -- More user groups... 
     {[UserGroups].[Group T].[All]}, 

     -- A bunch more blocks so that there is one for each row. 

     [UserGroups].[Group A].[All] * 
     {[UserGroups].[Group B].[All]} * 
     -- More user groups... 
     {[UserGroups].[Group T].&[True]} 
    ) 
    MEMBER [Measures].[Group Name] AS 
     CASE 
      WHEN [UserGroups].[Group A].CurrentMember.MemberValue <> 'All' THEN "Group A" 
      WHEN [UserGroups].[Group B].CurrentMember.MemberValue <> 'All' THEN "Group B" 
      -- More user groups... 
      WHEN [UserGroups].[Group T].CurrentMember.MemberValue <> 'All' THEN "Group T" 
      ELSE "Error" 
     END 
SELECT 

    {[Members].[Group Name], [Measures].[User Count], [Measures].[Revenue]} ON 0, 

    Order(
    [RowSet], 
) 
ON 1 
FROM [Finances]; 

ORDER 함수의 목적은 무엇입니까? 당신이 주문한 것을 볼 수 없습니까?

다시

단지 어둠 속에서 촬영하지만 난 가끔 생각 나는 UNION을 사용하고 + 연산자를 사용하여 사이 효율의 차이를 발견했습니다 - 그래서 다른 옵션을 :

WITH 
    SET [RowSet] AS 
     { 
     [UserGroups].[Group A].&[True] * 
     {[UserGroups].[Group B].[All]} * 
     -- More user groups... 
     {[UserGroups].[Group T].[All]} 
     } 
     + 
     { 
     [UserGroups].[Group A].[All] * 
     {[UserGroups].[Group B].&[True]} * 
     -- More user groups... 
     {[UserGroups].[Group T].[All]} 
     } 

     -- A bunch more blocks so that there is one for each row. 
     + 
     { 
     [UserGroups].[Group A].[All] * 
     {[UserGroups].[Group B].[All]} * 
     -- More user groups... 
     {[UserGroups].[Group T].&[True]} 
     } 
    MEMBER [Measures].[Group Name] AS 
     ... 
     ... 

사과 내가 definites 필요는 없습니다 - 위의 것은 행운을 자랄 수도있는 옵션입니다 !! 큐브 디자인에 대한 가능한 수정안에 대한 조언을 할 수 있기 때문에 Greg와 최대한 상세하게상의하십시오.