是否有人将复杂的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为null。它只有在满足特定条件时才会获得值。使用范围的主要原因是速度。比if / case块要快得多(更容易理解)
我不需要明确定义哪些基准有效,只是哪个基准无效。

下面是我们如何实现date实用程序维度。它允许我们做类似的事情
(度量,[日期计算]。[日期计算]。[先前期]),并为当前日期的当前成员使用先前的度量标准期(月份返回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;

最佳答案

[免责声明我正在为icCube工作]

范围不是icCube的一部分,尚未计划。这是一个棘手的功能,它自然不适合icCube的体系结构(请参阅下面的讨论,稍后...)。 icCube的优势还在于其研发团队的敏捷性,请随时与他们联系,他们将非常乐于改进和添加功能。

icCube中的某些功能可能与经典的MDX服务器不同,它们可能是有用的,它是Categories,SubCubes和eval函数。

Categories。允许定义行为类似于经典成员的新成员。可以将新成员定义为一组成员或子多维数据集。例如,在这里我们可以将[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

SubCubes允许将成员上更丰富的逻辑关系定义为一组元组。 icCube实现SubCubeComplementSubCubeIntersectSubCubeOthersSubCubeSymDifferenceSubCubeUnionSubCubeMinus。因此,在没有法国的情况下进行所有计算(在这里是微不足道的,但请考虑具有多对多关系的阶层)
  SubCubeMinus([Geography].[Geo].[All], [Geography].[Geo].[France] )

Eval函数允许评估subCube上的表达式。这是一个使用联合执行求和的简单示例:
 MEMBER [US+CH] AS Eval( SubCubeUnion( [Switzerland], [United States]) , [Amount])

最后但并非最不重要的一点是,对于date函数,您可以在icCube中定义Function,可以在MDX中重用,而无需在任何地方复制和粘贴:
 CREATE FUNCTION square( Value val ) AS val * val

并与CompactSet结合使用以更快地评估日期周期(如果在此维度上没有m2m关系)或调用一些Java functions(您必须激活默认关闭的此模块)。

- - - - - - - - - - - 范围 - - - - - - - - - - - - - -

警告:由于我对范围的了解是几年前的内容之一,因此注释可能已过时。我们走吧 :

Scope是一个不错的功能,但是您可以在Chris Webb的演示文稿(link)中检入一些缺陷,从47:30开始检查大约5分钟。

问题在哪里:

某种程度上,范围允许为子多维数据集定义新值(请记住,子多维数据集可能是单个不可分割的单元格,也可能是数千个不可分割的单元格)

1)范围允许定义子多维数据集的值,但是如果您想要该子多维数据集的“一部分”怎么办?

2)如果两个示波器发生碰撞(相交不为空)会发生什么?

所有这些都与安全性,多对多关系,子查询和set where子句混合在一起。

我们不是SSAS专家,有可能在加深了解后再次尝试实施一个干净的解决方案,但就我们所知,我们相信还有其他方法可以解决问题(例如,使用计算成员或写回)。

希望能帮助到你。

关于ssas - 将多维SSAS移植到ICCube。 Scope()是否等效?其他差距/问题?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39073918/

10-10 17:42