2013-09-23 3 views
1

두 가지 종류의 보고서 (보고서 보내기 및 보고서 받기)와 두 가지 역할 수행 차원 (보낸 사람 및 수신기)이 있습니다. 하나의 조직에 대한 각 보고서의 금액을 보낸 사람 /받는 사람별로 비교하려고합니다.LINKMEMBER로 MDX 계산 된 측정 값을 최적화했습니다.

나의 현재 쿼리는 다음과 같습니다

with member [Measures].[SentAmount] as ([Receiver].[Code].&[XXX],[Measures].[Sent]) 
member [Measures].[ReceivedAmount_Temp] as 
    (
     [Sender].[Code].&[XXX], 
     [Measures].[Received] 
    ) 
member [Measures].[ReceivedAmount] as 
(
    LINKMEMBER 
    (
     [Sender].[Code].CURRENTMEMBER,[Receiver].[Code] 
    ), 
    root([Sender]), 
    [Measures].[ReceivedAmount_Temp] 
) 
SELECT 
{ 
[Measures].[SentAmount], 
[Measures].[ReceivedAmount] 
} ON COLUMNS, 
NON EMPTY 
{ (
    [Sender].[Code].[Code].ALLMEMBERS 
    *[Sender].[Name].[Name].ALLMEMBERS 

)} FROM MyCube 

결과는 정확하지만 실행 시간이 매우 길다. 특히 15-20 개 조치를 취한 실제 검색어에 특히 유용합니다.

어떤 방식 으로든이 쿼리를 최적화 할 수 있습니까?

+0

큐브를 변경할 수 있습니까? 아니면 기존 큐브의 MDX를 최적화해야합니까? – FrankPl

+0

기존 큐브를 변경하지 않는 것이 좋습니다. 그러나 MDX 최적화가 불가능할 경우 변경 작업을 수행 할 수 있습니다. – zlatkovin

+0

불행히도 나는 여전히 해결책을 찾을 수 없다. 도움을 주시면 감사하겠습니다. – zlatkovin

답변

1

완전한 해결책은 아니지만 접근 방법 : "역할극 테이블"사용 : "보낸 사람"및 "받은 사람"이라는 사실 테이블의 사본이 두 개 있습니다. 둘 다 동일한 차원 "고객"을 참조합니다 (수신 팩트 테이블에서 수신자로, 송신 팩트 테이블에서 송신자로 참조). 상대방 (보낸 사실의 보낸 사람과 보낸 사람의 보낸 사람이 보낸 사람)은 이번에는 역할 연기 차원에서 고객 테이블을 참조합니다.

기술적으로 BIDS GUI가 두 측정 값 그룹에 대해 하나의 사실 테이블을 사용할 수 없으므로 DSV에서 뷰 또는 명명 된 쿼리를 통해이를 구현할 수 있습니다.

이점은 성능에 대한 주요 원인 일 수있는 쿼리에 대해 계산 된 측정 값이 필요 없다는 것입니다.

+0

멋지고 단순한 솔루션처럼 보입니다. 나는 확실히 이것을 시도 할 것이다. 나쁜 점은이 쿼리에 사용 된 4 개의 팩트 테이블 중 3 개가 매우 커서 처리하는 데 시간이 많이 걸리는 것입니다. – zlatkovin

0

명백한 [All] 멤버의 root() 함수를 바꾸어보십시오. 이상한 이유로, 계산 된 대책에 LinkedMember() 함수를 사용했을 때 root()가 매우 느리게 작동했습니다.

희망이 너무 도움이됩니다!

관련 문제