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。

你可能感兴趣的:(函数)