gpt4 book ai didi

ssas - 将多维 SSAS 移植到 ICCube。范围()等效?其他差距/问题?

转载 作者:行者123 更新时间:2023-12-02 01:22:30 25 4
gpt4 key购买 nike

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

下面是我们如何实现日期实用程序维度。它允许我们做类似的事情(measure,[Dim Date Calculations].[Date Calculations].[Prior Period]) 并且它为 dim 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 实现 SubCubeComplement , SubCubeIntersect , SubCubeOthers , SubCubeSymDifference , SubCubeUnionSubCubeMinus .所以在没有法国的情况下计算所有(这在这里很微不足道,但考虑具有多对多关系的层次结构)

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

Eval函数,允许评估子多维数据集上的表达式。这是一个使用 union 求和的简单示例:

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

最后但同样重要的是,对于日期函数,您可以定义 Function在 icCube 中,您可以在 MDX 中重复使用,无需复制粘贴到任何地方:

 CREATE FUNCTION square( Value val ) AS val * val

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

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

警告:注释可能已过时,因为我对范围的理解是几年前的事了。我们走吧:

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

问题在哪里/是:

范围允许以某种方式为子多维数据集定义一个新值(记住一个子多维数据集可能是单个不可分割的单元格以及数千个单元格)

1) Scopes 允许定义一个子多维数据集的值,但是如果你想要这个子多维数据集的“一部分”怎么办?

2) 如果两个作用域发生冲突(交集不为空)会怎样?

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

我们不是 SSAS 专家,在更好地理解之后,我们可能会再次尝试实现一个干净的解决方案,但据了解,我们相信还有其他方法可以解决问题(例如使用计算成员或回写)。

希望对您有所帮助。

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com