处理MDX查询的逻辑顺序

why*_*heq 3 olap ssas mdx

MDX脚本中子句的评估顺序是什么?

WITH 
  MEMBER measures.A AS ...
  MEMBER measures.B AS ...
  SET S1 AS ...
SELECT 
  {
    measures.A
   ,measures.B
   ,measures.x
  } ON COLUMNS
  {S1} HAVING <condition> on ROWS
FROM [Cube]
WHERE ({S2})
Run Code Online (Sandbox Code Playgroud)
  1. FROM
  2. WHERE
  3. WITH
  4. SELECT
  5. HAVING

但也许不是那么简单,因为a MEMBER和a SET在上下文方面有不同的处理方式 - 所以如果这个顺序是正确的,那么上下文如何结合?

Fra*_*kPl 6

我会说:

  1. FROM(包括潜在的子选择)
  2. 哪里
  3. WITH子句中的SET和MEMBER位置
  4. 并行构建所有查询轴(列,行,...)的元组列表,忽略NON EMPTY和HAVING
  5. 所有轴交点的单元格值
  6. 按照NON EMPTY的要求从轴中移除元组,并为每个轴移除HAVING.

通过步骤3中的"成员位置",我指的是成员存在的信息,以及层次结构中可能位于哪个层次结构中的信息.这不涉及成员定义表达式.这将在步骤5和6中进行评估.但步骤4需要该位置.

轴的并行评估意味着查询处理中的轴之间没有关系.

另请注意,这是概念视图.物理上,步骤6可以在步骤4的处理期间发生,或者优化器决定的是正确的执行顺序,只要结果是相同的.