Кто-нибудь когда-нибудь портировал сложный многомерный куб 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;