MDX-IF函数或声明

大家都知道,在SCOPE应尽量避免使用IF函数或声明。为什么?

IF内部会被重写为IIF,假设SCOPE内,

EVALUATION NODE

SUBSPACE S0

IF CONDITION;

THIS=CALC1; HIGHER PRIORITY

END IF

SUBSPACE S1

THIS = CALC2; LOWER PRIORITY

SUBSPACE S2

实际上,MDX ENGINGE 并不考虑在SCOPE内IF的条件,只有在运行时才评价它的条件。

一个问题是,为什么CACL1,CALC2有自己的SUBSPACE1,SUBSPACE2,而不是和EVALUATION的SUBSPACE0 一样?

原因在于,计算的范围可能低于评价的层次。例如,查询在年的层次,但计算需要月的层次。

上面的IF内部会重写成IIF,

EVALUATION NODE

SUBSPACE S0

THIS = IIF(CONDITION,CACL1,NULL);

SUBSPACE S1

THIS = IIF(DISJOINTTEST,CACL2,NULL);

SUBSPACE S2

注意: DISJOINTTEST 是一个内部函数,它输入一个单元,如果这个单元不在高优先级计算内,返回结果TRUE。

当S1,S2处于同一个层次,如果IF条件返回FALSE,它返回TRUE,这样,它退回到NOT 条件;

当S2低于S1,它首先会发现S1内单元包括S2的单元,接着评价被包括的单元的NOT条件。

这点不同于IIF,处于同一个SUBSPACE. 所以,IF可能会评价比原先更多的单元。

例外的是:

如果CALC2是SEMI-ADDITIVE MEASURE,UNARY OPERATOR, STORAGE ENGINE QUERY,S2并不会被重写为IIF。

CACL2并评价为一个更大的SUBSPACE,

如果仅是取数据,即STORAGE ENGINE QUERY,没有问题,除非数据巨大,需要大量的DISK IOS;

如果是SEMI-ADDITIVE MEASURE, OR UNARY OPERATOR, S2会成为不准确,因为它的SUBSPACE大。

一个不准确的SUBSPACE 会导致MDX在S2建立子树时,采用 CELL-BY-CELL MODE。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值