portieren von mehrdimensionalem SSAS nach ICCube. Scope () -Äquivalent? andere Lücken / Probleme?

Hat jemand jemals einen komplexen ssas multidmensionalen Cube auf iccube portiert? und haben Sie einen Ratschlag zu den gewonnenen Erkenntnissen / Lücken zwischen den beiden Tools usw.?

Der wichtigste, den ich sehen kann, ist scope (). Was ist das Äquivalent in iccube? verschachtelte if / case-Anweisungen?

Ich habe eine Liste hier. Noch etwas

        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)   |                        |
------------------------|------------------------|------------------------

Wir haben einen sehr schweren Würfel für die Berechnung von MDX-Skripten, und der Single-Thread-Charakter der SSAS-Berechnungsmaschine ist ein echter Engpass. Keines der anderen olap-Tools, die wir uns angesehen haben, war schnell genug oder sprachreich genug

Wir verwenden nicht verbundene Dienstprogrammdimensionen, um die Funktionalität zu steuern, und benötigen eine Datums-Dienstprogrammdimension (wir verwenden eine Version dieseshttp: //sqlmag.com/sql-server-analysis-services/optimizing-time-based-calculations-ssa), verwenden Sie AXIS () ausgiebig und haben Sie ein rekursives Summenprodukt über Nachkommen einer Hierarchie für eine nicht additive Kennzahl.

Unser Cube ist kein Self-Service-Berichtswürfel. Es ist eine mehrdimensionale Berechnungsmaschine für unsere App mit einem festen generischen Schema

Update 1: Ein einfacheres Beispiel für die Verwendung von scope. ic, Sie erwähnen, dass 'robuste' Workarounds existieren. Was wären sie für Code wie diesen?

// 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;

ies hat den Vorteil, dass complexcalc standardmäßig null ist. es erhält nur dann einen Wert, wenn es bestimmte Bedingungen erfüllt. Der Hauptgrund für die Verwendung des Oszilloskops liegt in der Geschwindigkeit. Viel schneller als if / case-Blöcke (und einfacher zu verstehen) muss ich nicht explizit definieren, welche Benchmarks gültig sind, nur welcher Benchmark nicht.

und unten sehen Sie, wie wir die Date Utility-Dimension implementiert haben. Es ermöglicht uns, so etwas wie (Measure, [Dim Date Calculations]. [Date Calculations]. [Prior Period]) zu tun, und es gibt die vorherige Messperiode für das aktuelle Mitglied des Dim Date an (Monat geht 1 Monat, Quartal zurück) geht 3 Monate zurück, Semester geht 6 Monate zurück, Jahr geht 12 Monate zurück). Es ist sehr sauber, genau und ziemlich schnell.

-- 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;

Antworten auf die Frage(2)

Ihre Antwort auf die Frage