大家都知道,在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。