SSAS - AVG计算但使用父/子维时使用SUM

时间:2016-08-25 19:45:24

标签: performance ssas mdx

我有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]

我进行了计算 [测量]。[AVG进入更高区域] ,其中包含度量 [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查询中是否存在错误,因为它太慢了。 / p>

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]

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

感谢您的帮助

2 个答案:

答案 0 :(得分:0)

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

包含CoalesceEmpty看起来像我一样永远不会遇到NULL - 所以这会很慢。

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

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

答案 1 :(得分:0)

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

  1. 如果您的数据始终位于第二级且结构已修复,为什么需要 Parent-Child 维度。使用国家和地区层次结构将其更改为常规维度,创建灵活关系Region -> Country和自定义层次结构Country - Region(请参阅AdventureWorks Customer Dim作为示例)。
  2. 使用 SCOPE - 在国家/地区层次结构和国家/地区级别重新定义 [Measures]。[Sales SUM] ,计算为儿童平均值。