首先,了解一下FORMULAR ENGINE (FE) 的基本概念:
1,SUBSPACE
MDX EXPRESSION 总是返回 CUBE SPACE 的一个 SUBSPACE
2,RECTANGULAR SUBSPACE VS. ARBITRARY-SHAPED SUBSPACE
FE 处理 RECTANGULAR SUBSPACE 高效。
{FOOD,DRINK}*{2010,2011} 是 RECTANGULAR SHAPE;
{(FOOD,2010)}*{(DRINK,2011)} 是 ARBITRARY SHAPED.
3,BLOCK MODE VS. CELL-BY-CELL MODE
显然,BLOCK MODE 快很多。
4,SPARSE-EXPRESSION VS. DENSE EXPRESSION
SPARSE-EXPRESSION 是一个单值表达式,如果不是, 就是 DENSE-EXPRESSION.
5, 变化属性
它是MDX表达式依靠的子空间大于一个成员。FE 建立逻辑计划树后,产生变化属性。
6,逻辑计划
MDX 表达式执行多个阶段,每个阶段有一个逻辑计划。有时,一个大的逻辑计划树,FE需要建立子计划树。
7, DEFAULT VALUE
一个单值表达式是默认值,产生于FE建立逻辑计划后。
IIF函数执行计划
开始,IIF 函数会重写
IIF(a AND b, x, y) => IIF(a, IIF(b, x, y), y)
IIF(a OR b, x, y) => IIF(a, x, IIF(b, x, y))
然后,FE建立逻辑计划,必要的话,建立子树。
接着,建立 THEN 和 ELSE 分支计划,这里有两个模式: EAGER AND STRICT.
如果分支计划是原子空间,EAGER MODE;如果建立新子空间,STRICT MODE.
显然,STRICT MODE 好,子空间小。
这里, 可以增加执行暗示:
IIF(p, x HINT EAGER, y HINT STRICT)
必须指出的是,实际执行计划非常复杂,下面的一些做法或许有益:
1,使用 STRICT HINT,如果过量磁盘读数据
2,FE 试图 STRICT MODE ,失败后, 返回 EAGER MODE,这些 TRIAL-AND-ERRORS浪费时间,增加暗示 EAGER,减少不必要的尝试。
3,NESTED IIF PREDICATE顺序,这点非常重要。AND, OR 总是重写,顺序关键。
4,使用 LAZY HINT。
CASE 声明
它被重写:
CASE
WHEN p1 THEN e1
WHEN p2 THEN e2
...
WHEN pN THEN eN
ELSE eL
END
=>
IIF (p1, e1, IIF(p2, e2, ... IIF(pN, eN, eL)...))
暗示如下:
CASE HINT <EAGER|STRICT>
WHEN ... THEN ...
...
ELSE ...
END
因此,它的执行计划和IIF一样,上述适用于它,例外的是,简单CASE STATEMENT 不能 使用 EAGER AND STRICT,其他和以上的 SEARCH CASE 相同,不赘述。