перенос многомерных SSAS на ICCube. Эквивалент Scope ()? другие пробелы / проблемы?

Кто-нибудь когда-нибудь портировал сложный многомерный куб 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-наосновевычислений-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. он получает значение только тогда, когда удовлетворяет определенным условиям. Основная причина использования прицела - скорость. Намного быстрее, чем блоки 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;

person jkmelbs    schedule 22.08.2016    source источник


Ответы (1)


[отказ от ответственности Я работаю на icCube]

Сфера не является частью icCube, пока не планируется. Это сложная функция, которая, естественно, не вписывалась в архитектуру icCube (см. Обсуждение ниже, позже ...). Сильной стороной icCube является также гибкость его команды исследований и разработок, не стесняйтесь обращаться к ним напрямую, и они будут более чем счастливы улучшить и добавить функции.

В icCube есть некоторые функции, которые отличаются от классического сервера MDX, которые могут быть полезны, это Категории, Подкубы и функция eval.

Категории. Позволяет определить новый член, который ведет себя как классические элементы. Этот новый член может быть определен как набор членов или как вложенный куб. Например, здесь мы можем определить члена категории [Top10] как 10 наших самых важных клиентов:

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

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

Подкубы, позволяет определять более сложные логические отношения между членами в виде набора кортежей. icCube реализует SubCubeComplement, SubCubeIntersect, SubCubeOthers, SubCubeSymDifference, SubCubeUnion и SubCubeMinus. Итак, вычисление всего без Франции (здесь это тривиально, но подумайте о иерархиях с отношениями многие-ко-многим)

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

Функция Eval позволяет оценивать выражение на вложенном кубе. Вот тривиальный пример вычисления суммы с помощью объединения:

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

И последнее, но не менее важное: для функции дат вы можете определить функцию в icCube, который вы можете повторно использовать в своем MDX, не нужно копировать и вставлять везде:

 CREATE FUNCTION square( Value val ) AS val * val

и в сочетании с CompactSet для более быстрой оценки периодов дат (если есть нет отношений m2m в этом измерении) или вызовите некоторые функции Java (вы ' ve, чтобы активировать этот модуль, который по умолчанию выключен).

--------------------- Сфера ---------------------------

Предупреждение: комментарии могут быть устаревшими, поскольку мое понимание области действия такое же, как несколько лет назад. Пойдем :

Scope - хорошая функциональность, но есть некоторые недостатки, которые вы можете проверить в презентации Криса Уэбба (ссылка), проверяйте с 47:30 около 5 минут.

Проблемы, где / находятся:

Каким-то образом область видимости позволяет определить новое значение для вложенного куба (помните, что вложенный куб может быть как одной неделимой ячейкой, так и тысячами из них)

1) Области действия позволяют определять значение вложенного куба, но что делать, если вам нужна «часть» этого вложенного куба?

2) Что произойдет, если два прицела столкнутся (пересечение не пусто)?

И все это в сочетании с безопасностью, отношениями «многие ко многим», подзапросами и предложениями set where.

Мы не являемся специалистами по SSAS, и возможно, что с более глубоким пониманием мы попробуем еще раз реализовать чистое решение, но, как известно, мы считаем, что есть другие способы решения проблем (например, с помощью элементов вычисления или обратной записи).

Надеюсь, поможет.

person ic3    schedule 23.08.2016
comment
Привет и спасибо за информацию. Да, я слишком хорошо знаю о проблемах с областью действия, решающим_порядком и т. Д. :). Но в нашем кубе 2 физических показателя и около 300 вычислений. Которые управляются с помощью SCOPE () по соображениям производительности. Они начинают свою жизнь как NULL, и им присваивается значение только при соблюдении определенных условий / пересечений. Я добавил пример в исходный пост - person jkmelbs; 24.08.2016
comment
robust было немного преувеличением, я удалил его. Я вижу ваш пример, решение в iccube будет использовать calc. меры в текущей версии. Я предполагаю, что в конце концов нам придется добавить объем ... - person ic3; 24.08.2016