优化DAX中的Summarize函数

3
我有一个DAX公式,可以给我在一个月内出现在事实表中的id数量进行计数,并在一年内平均。我可以将此度量放入表格中,并通过添加维度变量按行展开,没有任何问题。
Measure:= AVERAGEX(
    SUMMARIZE(
        CALCULATETABLE(fact_table;FILTER('Time_Dimension';'Time_Dimension'[Last_month] <> "LAST"));
         Time_Dimension[Month Name];
        "Count";DISTINCTCOUNT(fact_table[ID])
    );
    [Count]
)

但是它非常缓慢(在一个单独的表上我有3个类似这样的度量),而且事实表很大(像3亿行大)

我读到 SUMMARIZE 在聚合时表现非常差,应该用 SUMMARIZECOLUMNS 替换。我写了这个公式。

Measure_v2:= AVERAGEX(
    SUMMARIZECOLUMNS(
        Time_Dimension[Month Name];
        FILTER(Time_Dimension;
            Time_Dimension[Month Name]<>"LAST"
        );
        "Count";DISTINCTCOUNT(fact_table[ID])
    )
    [Count]
)

当我将度量视觉化时,它可以正常工作,但是当我尝试将其放入上下文中(例如上面的表格)时,它会出现错误“无法在此上下文中使用SUMMARIZECOLUMN和ADDMISSINGITEMS()”。 我如何从原始的SUMMARIZE函数进行可持续优化?

1个回答

4
在优化SUMMARIZE之前,建议重新审视整体方法。如果你的目标是计算每个年月份的平均事实数,则有一种更简单(且更快)的方法。
[ID Count]:=CALCULATE(COUNT('fact_table'[ID]),'Time_Dimension'[Last_month] <> "LAST") 

[Average ID Count]:=AVERAGEX( VALUES('Time_Dimension'[Year_Month]), [ID Count`])

假设:
  • 您的时间维度中有年月属性;
  • 事实表中的ID是唯一的(因此,简单计数就足够了)。
如果这个解决方案不能解决您的问题,请发布您的数据模型 - 不知道数据结构很难进行优化。
顺便说一句,我会从事实表中删除ID字段。它对模型没有任何价值,并且占用大量内存。您可以通过简单地计算行数来达到目标。
[Fact Count]:=CALCULATE(COUNTROWS('fact_table'),'Time_Dimension'[Last_month] <> "LAST") 

我更改了变量名称,因此实际上ID类似于与商店维度相关联的“商店ID”,并且它不是主键(存在重复项,因此上面使用了DISTINCTCOUNT)。我将尝试您的解决方案,但将其应用于按日期分组的度量的另一个版本,因为目前我的时间维度中没有月份-年份。 - Crysis85
在日常使用中尝试过并且非常有效,对于月度报表,我可以通过连接创建一个月份-年份的列。如果您有更多的优化建议,请告诉我。谢谢。 - Crysis85

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接