5

我在 icCube 中建立了一个基于 General Ledger 代码块的模型,它具有以下维度(非限制性):

  • 时间
  • 实体
  • 成本中心
  • 帐户
  • 公司间聚会
  • 项目
  • 活动
  • 金额(这是价值)

将此模型加载到工具 Planning 中时,如果 x 轴上有超过 3 个维度折叠到底层,则会出现性能问题。

我试图检查 icCube 是否可以更好地处理这个问题,但是 3 维的语句花了我超过 1700 秒:

select [Dec] on 0
, non empty { Descendants([Account].[Account].[Total],,leaves) }
     * { Descendants([Activity].[Activity].[Total],,leaves) }
     * { Descendants([CostCenter].[CostCenter].[Total],,leaves) } on 1
from finance

行上有多个维度的原因是用户希望看到尽可能多的代码块细节,最好是完整的代码块。

我受到以下事实的挑战:其他工具可以很容易地处理这种事情,因为它没有底层的 OLAP 数据库,但它使用层次结构直接查询数据单元格。在 Excel 中查询数据的提取时获得相同的性能(数据行不多)。

数据信息:

  • 规模相当庞大:400 个帐户、6000 多个活动、50 个实体、500 个成本中心
  • 维度活动和项目非常扁平(几乎没有结构)
  • 只有 50.000 个数量,因此数据非常稀疏

任何建议或提示如何解决这个问题?

4

1 回答 1

4

这是 MDX 中的经典问题,值得创建 MDX 反模式并将其作为数字 1。

您正在计算的交叉连接将产生 400x60000x500 = 12000000000 (12X10^9) 个元组,我们要求对每个元组进行评估。这使得每秒进行很多评估。

看起来像是一种“奇怪”的方式进行钻取。我会进行钻取,但让我们尝试在 MDX 中解决这个问题:

解决方案是通过尽快执行非空来尝试减少生成的元组的数量。所以 :

 noempty( noempty(A) x noempty(B) ) x noempty(C)
   or 
 noempty(A) x noempty( noempty(B)  x noempty(C) )

使用少一些 nonempty 的第一个版本:

select 
[Dec] on 0, 
nonempty( 
  nonempty( 
      Descendants([Account].[Account].[Total],,leaves)
    * nonempty( Descendants([Activity].[Activity].[Total],,leaves) , [DEC] )
  , [DEC] )
  * { Descendants([CostCenter].[CostCenter].[Total],,leaves) } 
, [DEC] )
on 1
from [finance]

在 icCube 中,您将创建一个执行此操作以简化语法的函数

 Function megaCrossjoin1(A,B,C,M) as nonempty( nonempty(A,M) * nonempty(B,M), M) * nonempty(C,M)

并使用它

megaCrossjoin1( 
   Descendants([Account].[Account].[Total],,leaves) ,
   Descendants([Activity].[Activity].[Total],,leaves) ,
   Descendants([CostCenter].[CostCenter].[Total],,leaves) ,
   [Dec]) 

希望能帮助到你

于 2014-08-29T13:13:36.037 回答