2016-08-22 1 views
2

누구나 복잡한 SSF 다차원 큐브를 iccube에 이식 한 사람이 있습니까? 두 도구 간의 교훈/차이점에 대해 조언 해 줄 수 있습니까?다차원 SSAS를 ICCube에 이식합니다. 범위()와 동일합니까? 다른 간격/문제?

내가 볼 수있는 주요한 것은 scope()입니다. iccube에서 이에 상응하는 것은 무엇입니까? 중첩 된 경우/case 문?

여기 목록이 있습니다. 다른 건 없니?

 function  |   SSAS   |   iccube  
------------------------|------------------------|------------------------ 
multi threaded calcs | no      | yes 
------------------------|------------------------|------------------------ 
fix/scope block code | SCOPE()    | ?? 
------------------------|------------------------|------------------------ 
custom functions  | clr.net but it's slow | mdx+ 
------------------------|------------------------|------------------------ 
generic date utility | third-party code that | ?? 
dimensions (eg generic | uses scope() eg  | 
prior period/prior  | datetool    | 
corresponding period) |      | 
------------------------|------------------------|------------------------ 

우리는 매우 mdx 스크립트 계산 헤비 큐브가 있으며 SSAS 계산 엔진의 단일 스레드 특성은 실제 병목 현상입니다. 우리가 살펴본 다른 olap 도구 중 어느 것도 충분히 빠르지 않았거나 충분히 풍부한 언어를 가지고 있지 않다.

우리는 기능을 수행하기 위해 연결이 끊긴 유틸리티 크기를 사용하며 날짜 유틸리티 크기가 필요하다. http://sqlmag.com/sql-server-analysis-services/optimizing-time-based-calculations-ssas), AXIS()를 광범위하게 사용하고 비 부가적인 측정을 위해 계층의 하위에서 재귀 적 합을 구하십시오.

큐브는 자체 서비스보고 큐브가 아닙니다. 우리가 범위를 사용하는 방법에 대한 간단한 예 : 그것은 고정 된 일반적인 스키마


업데이트 1와 우리의 응용 프로그램에 대한 다차원 계산 엔진입니다. ic, 당신은 '견고한'대안이 있음을 언급합니다. 이런 코드에 대해 그들은 무엇을 할 것입니까?

// Assumes the date utility dim has been setup as with the priorperiod function as [Dim Date Calculations].[Date Calculations].[Prior Period] 

// DimBenchmark is a single attribute disconnected utility dimension. The initial/default value is DimBenchmark.Benchmark.None ie do nothing. The remainder are dynamically set based on code. hardcoded below for simplicity 
Scope(DimBenchmark.BenchMark.PriorPeriod); 
    THIS = [Dim Date Calculations].[Date Calculations].[Prior Period]; // assign the value of some physical and utility dim members to new benchmark attributes. Allows us to only refer to dimbenchmark in subsequent code, irrespective of number of benchmarks or the src dimension.attribute 
END SCOPE; 

SCOPE(DimBenchmark.BenchMark.Budget); 
    THIS = DimScenario.Scenario.Budget; //we also have a budget 
END SCOPE; 
.... // any number of other benchmarks 

Create measure currentcube.measures.ComplexCalc as NULL; 

SCOPE (measures.ComplexCalc); // this code will only change how complex calc behaves 
    SCOPE (DimBenchmark.Benchmark.All - DimBenchmark.Benchmark.None); // this will only change the ComplexCalc when the active benchmark selection is not "none" 
     this= (some measure,Complex subcube etc); 
    End Scope; 
End Scope; 

기본적으로 complexcalc는 null입니다. 특정 조건을 충족 할 때만 값을 얻습니다. 범위를 사용하는 주요 이유는 속도입니다./case 블록보다 훨씬 빠릅니다 (더 간단하게 이해할 수 있습니다) 어떤 벤치 마크가 유효한지 명시 적으로 정의 할 필요가 없으며 단지 어느 벤치 마크가 유효하지 않은지를 명시 적으로 정의 할 필요가 없습니다.

이하는 날짜 유틸리티 차원을 구현 한 방법입니다. 그것은 우리가 (measure, [Dim Date Calculations]. [Date Calculations]. [Prior Period])와 같은 것을 할 수있게하며, 현재 날짜의 현재 날짜에 대한 이전 측정을 사용합니다 (1 개월 전, 분기 3 개월 되돌아 간다, 학기 6 개월 되돌아 간다, 1 년 12 개월 뒤로 간다). 그것은 매우 깨끗하고 정확하며 빠릅니다.

-- Fiscal Month 
Scope([Dim Date].[Month Key].[Month Key].members);   
    -- Prior Period 
    Scope([Dim Date Calculations].[Date Calculations].[Prior Period]);   
     this =  
     ([Dim Date].[Month Key].CurrentMember.PrevMember 
     ,[Dim Date Calculations].[Date Calculations].[Current] 
     );   
    END scope;          
End Scope;   


-- Fiscal Quarter 
Scope([Dim Date].[Fiscal Quarter].[Fiscal Quarter].members);   
    -- Prior Period 
    SCOPE([Dim Date Calculations].[Date Calculations].[Prior Period]);   
     THIS = ([Dim Date].[Fiscal Quarter].CurrentMember.PrevMember 
     ,[Dim Date Calculations].[Date Calculations].[Current] 
     );   
    END SCOPE;      
END SCOPE;   

-- Fiscal Semester 
Scope([Dim Date].[Fiscal Semester].[Fiscal Semester].members);   
    -- Prior Period 
    SCOPE([Dim Date Calculations].[Date Calculations].[Prior Period]);   
     THIS = ([Dim Date].[Fiscal Semester].CurrentMember.PrevMember 
     ,[Dim Date Calculations].[Date Calculations].[Current] 
     );   
    END SCOPE;         
End Scope;   

-- Fiscal Year 
Scope([Dim Date].[Fiscal Year].[Fiscal Year].members);      
    -- Prior Period 
    SCOPE([Dim Date Calculations].[Date Calculations].[Prior Period]);   
     THIS =  
     ([Dim Date].[Fiscal Year].CurrentMember.PrevMember 
     ,[Dim Date Calculations].[Date Calculations].[Current] 
     );   
    END SCOPE;     
End Scope; 

답변

2

범위가 icCube의 일부가 아닌 [내가 icCube을 위해 일하고 부인은, 아직 계획하지. 그것은 자연스럽게 icCube의 아키텍처에 맞지 않는 까다로운 기능입니다 (아래 설명 참조, 나중에 ...). icCube의 강점은 R & D 팀의 민첩성이기도하므로 직접 연락하기를 주저하지 말고 개선하고 기능을 추가하는 것이 더 행복 할 것입니다.

icCube에는 유용한 MDX 서버와 다른 몇 가지 기능이 있습니다.이 기능은 범주, 하위 큐브 및 평가 기능입니다.

Categories. 클래식 멤버처럼 동작하는 새 멤버를 정의 할 수 있습니다. 이 새 멤버는 멤버 집합 또는 하위 큐브로 정의 할 수 있습니다. ,

CATEGORY MEMBER [Top10] as TopCount([Customers], 10, ([Measures].[Sales],[2015])) 

-> so later on ([Top10], [Sales]) will return the sales of this top10 customers 

하위 큐브 튜플의 집합으로 회원에 풍부한 논리 관계를 정의 허용 : 예를 들어 여기에 우리가 우리의 10 개의 가장 중요한 고객으로 [상위 10 위] 카테고리 멤버를 정의 할 수 있습니다.icCube는 SubCubeComplement, SubCubeIntersect, SubCubeOthers, SubCubeSymDifference, SubCubeUnionSubCubeMinus을 구현합니다. 그래서 프랑스없이 모든 계산

SubCubeMinus([Geography].[Geo].[All], [Geography].[Geo].[France]) 

Eval 기능, 하위 큐브에 표현식을 평가 할 수 있습니다 (여기가 사소한, 그러나 다 대다 관계로 hierachies에 생각). 여기에 노동 조합을 사용하여 합계를하고 사소한 예는 다음과 같습니다

MEMBER [US+CH] AS Eval(SubCubeUnion([Switzerland], [United States]) , [Amount]) 

마지막으로, 날짜는 당신이 당신의 MDX에서 다시 사용할 수 있습니다 icCube에서 Function를 정의 할 수 있습니다 기능에 대한 필요가 사방 & 붙여 넣기를 복사 없음 :

CREATE FUNCTION square(Value val) AS val * val 

(이 차원에는 M2M 관계가없는 경우) 날짜 기간에 빠른 평가 CompactSet과 결합 또는 일부 Java functions 전화 (당신은 기본적으로 꺼져이 모듈을 활성화했습니다).

--------------------- 범위 ------------------------ ---

경고 : 범위에 대한 나의 이해가 몇 년 전의 일이기 때문에 주석이 더 이상 쓸모가 없을 수도 있습니다. 가자 :

범위는 좋은 기능이지만 Chris Webb의 프레젠테이션 (link)에서 확인할 수있는 단점이 47:30에서 약 5 분 동안 확인하십시오.

있습니다/이슈 :

어떻게 든 범위는 하위 큐브에 대한 새 값을 정의 (하위 큐브는 하나의 불가분의 세포 수 있습니다 기억뿐만 아니라 그들의 수천) 수를

1) 스코프 하위 큐브의 값을 정의 할 수 있지만이 하위 큐브의 '일부'를 원한다면 어떻게합니까?

2) 두 스코프가 충돌하면 (교차점이 비어 있지 않은 경우) 어떻게됩니까?

그리고이 모든 것이 보안, 다 대다 관계, 하위 쿼리 및 집합 where 절과 섞여 있습니다.

우리는 SSAS 전문가가 아니므로 더 나은 이해를 통해 다시 깨끗한 솔루션을 구현할 수 있지만 문제를 해결하는 다른 방법이 있다고 생각됩니다 (예 : calc. 회원 또는 쓰기 되돌림).

도움이 되길 바랍니다.

+0

안녕하세요. 감사합니다. 네, 범위와 문제에 대해 알고, solve_order 등 .. 너무 잘 :). 그러나 우리 큐브에는 2 가지 phyiscal 측정 값과 약 300 개의 계산이 있습니다. 성능상의 이유로 SCOPE()를 사용하여 제어됩니다. 수명은 NULL로 시작되며 특정 조건/교차점이 충족 될 때만 값이 할당됩니다. 원래 게시글에 예제를 추가했습니다. – jkmelbs

+0

강력하고 과장된 부분이 있었지만 삭제했습니다. 나는 당신에게 예제를 보았는데, iccube의 해법은 calc를 사용할 것이다. 현재 버전의 측정 값. 결국 우리는 범위를 추가해야 할 것입니다 ... – ic3