如何优化 MDX 应该根据选择的半年有条件地在两个 Measure 之间做出决定(涉及 SCOPE,Descendants Statements)
How to optimize MDX that should conditionally decide between two Measures based on the half Year choosen (involving SCOPE, Descendants Statements)
[条件预测成本] 是根据名为 "Cost" 和 "Forecast Cost" 的度量通过以下范围语句生成的。
这些语句工作正常,但速度太慢。特别是如果在报告中选择了整年(甚至更多年)。等待时间可能超过 5 分钟。
知道如何优化此 MDX 吗?
SCOPE ([Measures].[Conditional Forecast Cost]);
THIS = (IIF([DIM Date].[Half Year].&[1],[Measures].[Cost], [Measures].[Forecast Cost]));
END SCOPE;
SCOPE ([DIM Date].[Iso Month].[All].children, [Measures].[Forecast Costs]);
THIS = SUM(
Descendants(
[DIM Date].[Iso Month].CurrentMember,
[DIM Date].[Iso Month]
),
[Measures].[Conditional Forecast Cost]
);
END SCOPE;
背景资料:
第一个语句代表基本逻辑。
- 如果选择上半年,措施"Cost"应该是
应用。
- 下半年的措施"Forecast Cost"应该是
应用。
只要我们按月报告就可以正常工作。
- 如果应该汇总全年,则第一个语句不是
足够了,因为引擎不会按照我们定义的方式聚合
它与 "IIF([DIM Date].[Half Year].&[1],[Measures].[Cost] ..." .
因此,带有后代函数的第二个 SCOPE 语句强制引擎从较低的月度级别进行聚合。
到目前为止这行得通,但速度真的很慢。
附加信息:
- 现在我们更愿意在语义层中实现这个逻辑
使用 MDX 而不是在 ETL 中。
- "Cost" 度量也是 MDX 中的计算度量。
- DIM 日期维度有一个层次结构,只有 "YEAR-Month"(属于
当然还有一些额外的属性)。
- 请显示 MEASURES 的 MDX 脚本。[成本]。
您的 IIF 描述了两个
子多维数据集 => SCOPE 作业。将其转换为这样的形式(简化):
MEASURES.[Conditional Forecast Cost] = [Measures].[Forecast Cost]
SCOPE([DIM Date].[Half Year].&[1])
MEASURES.[Conditional Forecast Cost] = [Measures].[Cost];
END SCOPE;
- 你有递归(非常糟糕!):[条件预测成本]调用[预测成本],然后[预测成本]调用[条件预测成本]!你必须不递归地重写它!
[条件预测成本] 是根据名为 "Cost" 和 "Forecast Cost" 的度量通过以下范围语句生成的。
这些语句工作正常,但速度太慢。特别是如果在报告中选择了整年(甚至更多年)。等待时间可能超过 5 分钟。 知道如何优化此 MDX 吗?
SCOPE ([Measures].[Conditional Forecast Cost]);
THIS = (IIF([DIM Date].[Half Year].&[1],[Measures].[Cost], [Measures].[Forecast Cost]));
END SCOPE;
SCOPE ([DIM Date].[Iso Month].[All].children, [Measures].[Forecast Costs]);
THIS = SUM(
Descendants(
[DIM Date].[Iso Month].CurrentMember,
[DIM Date].[Iso Month]
),
[Measures].[Conditional Forecast Cost]
);
END SCOPE;
背景资料:
第一个语句代表基本逻辑。
- 如果选择上半年,措施"Cost"应该是 应用。
- 下半年的措施"Forecast Cost"应该是 应用。
只要我们按月报告就可以正常工作。
- 如果应该汇总全年,则第一个语句不是 足够了,因为引擎不会按照我们定义的方式聚合 它与 "IIF([DIM Date].[Half Year].&[1],[Measures].[Cost] ..." .
因此,带有后代函数的第二个 SCOPE 语句强制引擎从较低的月度级别进行聚合。 到目前为止这行得通,但速度真的很慢。
附加信息:
- 现在我们更愿意在语义层中实现这个逻辑 使用 MDX 而不是在 ETL 中。
- "Cost" 度量也是 MDX 中的计算度量。
- DIM 日期维度有一个层次结构,只有 "YEAR-Month"(属于 当然还有一些额外的属性)。
- 请显示 MEASURES 的 MDX 脚本。[成本]。
您的 IIF 描述了两个 子多维数据集 => SCOPE 作业。将其转换为这样的形式(简化):
MEASURES.[Conditional Forecast Cost] = [Measures].[Forecast Cost] SCOPE([DIM Date].[Half Year].&[1]) MEASURES.[Conditional Forecast Cost] = [Measures].[Cost]; END SCOPE;
- 你有递归(非常糟糕!):[条件预测成本]调用[预测成本],然后[预测成本]调用[条件预测成本]!你必须不递归地重写它!