MDX-IIF函数和CASE声明的执行计划

首先,了解一下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 相同,不赘述。

你可能感兴趣的:(case)