【问题标题】:SSAS - AVG Calculation but when used parent/child dimension use SUMSSAS - AVG 计算,但在使用父/子维度时使用 SUM
【发布时间】:2016-08-25 19:45:23
【问题描述】:

我有这个DWH结构

DimRegion

ID  IDParent Level Region       
1 |  NULL    |  0   | World             
2 |   1      |  1   |America
3 |   1      |  1   |Europe
4 |   2      |  2   |USA
5 |   2      |  2   |Canada
6 |   2      |  2   |Mexico
7 |   3      |  2   |Italy
8 |   3      |  2   |France

FactSales

ID  IDDimRegion IDDimDate  Sales 
1 | 7          | 20150101        | 20
2 | 7          | 20150201        | 30
3 | 7          | 20150301        | 40
4 | 4          | 20150101        | 50
5 | 4          | 20150201        | 30
6 | 4          | 20150301        | 40
7 | 5          | 20150101        | 60
8 | 5          | 20150201        | 30
9 | 5          | 20150301        | 60
10| 8          | 20150101        | 10
11| 8          | 20150201        | 10
12  8          | 20150301        | 10

等等……

Fact 表中的所有值仅连接到 DimRegion 表中级别 2 的值。

我在 SSAS 中创建了多维数据集 [Sales Cube]

  • 父/子维度DimRegion
  • 维度DimDate
  • 使用 SUM 聚合的度量 [Sales SUM]

我进行了计算 [Measures].[AVG Into Higher regions] 将度量 [Sales SUM] 并进行聚合 AVG 到更高级别的地区。

CREATE 
  MEMBER CURRENTCUBE.[Measures].[AVG Into higher regions] AS 
    CoalesceEmpty
    (
      Avg
      (
        Descendants
        (
          [DimRegion].[IDParent].Children,
         ,LEAVES
        )
       ,[Measures].[Sales SUM]
      )
     ,[Measures].[Sales SUM]
    ) 
   ,VISIBLE = 1 ;

但是当我在 MDX 查询中使用维度日期和 IDDimDate 成员进行此计算时速度非常慢,所以我不知道计算中或此 MDX 查询中是否有错误,因为它太慢了。

SELECT 
NON EMPTY { [Measures].[AVG Into higher regions] } ON COLUMNS, 
NON EMPTY 
{ (
DESCENDANTS([DimRegion].[IDParent].[Level 02].ALLMEMBERS) * 
[DimDate].[IDDimDate].[IDDimDate].ALLMEMBERS ) } ON ROWS 
FROM [Sales Cube]

在我的 tes 数据仓库中,我在事实表中有大约 200 行,并且在 Date 维度中预先生成了 20 年,它是 7300 行,所以它可能是由 Date 维度引起的。但是最终的事实表将有大约 100 万行,所以在这么少的行上它这么慢是很糟糕的。

感谢您的帮助

【问题讨论】:

  • CoalesceEmpty 的意义何在?如果您将其排除在衡量标准之外,该衡量标准仍然有效吗?
  • 我在那里有 CoalesceEmpty,因为父/子层次结构中的最低值有 (null) 没有它,所以这使得 (null) 值被替换为 Sales SUM 度量中的值

标签: performance ssas mdx


【解决方案1】:

NULLolap 计算的朋友,在创建稀疏计算方面,然后在块模式下运行 - 而不是逐个单元格的计算。

在我看来,您包含 CoalesceEmpty 就像永远不会遇到 NULL - 所以这会很慢。

如果没有这个功能,你会得到错误的答案吗?

CREATE 
  MEMBER CURRENTCUBE.[Measures].[AVG Into higher regions] AS 
      Avg
      (
        Descendants
        (
          [DimRegion].[IDParent].Children,
         ,LEAVES
        )
       ,[Measures].[Sales SUM]
      )
   ,VISIBLE = 1 ;

【讨论】:

  • 感谢您的帖子,但对查询的性能没有帮助
【解决方案2】:

我认为您可以重新设计您的案例以利用 OLAP 和多维数据集的优势。

  1. 如果您的数据始终处于第二级并且结构是固定的,为什么还需要 父子 维度。将其更改为具有 Country 和 Region 层次结构的常规维度,创建灵活的关系 Region -> Country 和自定义层次结构 Country - Region(以 AdventureWorks Customer Dim 为例)。
  2. 使用 SCOPE - 在国家/地区层次结构和国家/地区级别重新定义 [Measures].[Sales SUM],以计算为儿童的平均值。

【讨论】:

  • 我的例子写得不太正确,实际上这个值是对父/子层次结构的最低成员的引用,它可以有超过 2 个级别
猜你喜欢
  • 2011-06-13
  • 1970-01-01
  • 2019-04-28
  • 1970-01-01
  • 1970-01-01
  • 2021-12-27
  • 1970-01-01
  • 2013-03-17
  • 1970-01-01
相关资源
最近更新 更多