портирование многомерного SSAS на ICCube. Сфера () эквивалентна? другие пробелы / проблемы?

Кто-нибудь когда-нибудь переносил сложный многомерный куб ssas на iccube? и есть какие-либо советы по извлеченным урокам / пробелам между этими двумя инструментами и т. д.?

Главный из них, который я вижу, это scope (). Что эквивалентно в iccube? Вложенные ли if / 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 является нулем по умолчанию. это только получает значение, когда это встречает определенные условия. Основная причина использования прицела - скорость. Гораздо быстрее, чем блоки if / case (и проще для понимания). Мне не нужно явно определять, какие тесты действительны, а какой - нет.

а ниже показано, как мы реализовали измерение полезности даты. Это позволяет нам делать что-то вроде (мера, [Расчеты даты затемнения]. [Расчеты даты]. [Предыдущий период]) и дает возможность использовать предыдущий период меры для текущего элемента затемнения даты (месяц возвращается на 1 месяц, квартал 3 месяца назад, семестр - 6 месяцев, год - 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;

Ответы на вопрос(1)

Ваш ответ на вопрос