在 DAX 中优化汇总

Optimizing Summarize in DAX

我有这个 DAX 公式,可以计算一个月内出现在事实 table 上的 id 数,计算全年的平均值。我可以把这个度量是一个 table 广告,它按行解包没有问题(通过添加维度变量)

Measure:= AVERAGEX(
    SUMMARIZE(
        CALCULATETABLE(fact_table;FILTER('Time_Dimension';'Time_Dimension'[Last_month] <> "LAST"));
         Time_Dimension[Month Name];
        "Count";DISTINCTCOUNT(fact_table[ID])
    );
    [Count]
)

但它太慢了(我在一个 table 上有 3 个这样的度量)而且 table 很大(比如 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]
)

当我按原样可视化度量时,它会起作用,但是当我尝试将其放在上下文中时(如上面的 table),它会给我错误 "Can't use SUMMARIZECOLUMN and ADDMISSINGITEMS() in this context" 我怎么能对原始 SUMMARIZE 函数进行可持续优化?

在优化 SUMMARIZE 之前,我会重新审视整体方法。如果您的目标是计算每年每月的平均事实计数,则有一种更简单(也更快)的方法。

[ID Count]:=CALCULATE(COUNT('fact_table'[ID]),'Time_Dimension'[Last_month] <> "LAST") 

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

假设:

  • 你的时间维度有年月属性;
  • 您的事实 table 中的 ID 是唯一的(因此,简单计数是 够了)

如果此解决方案不能解决您的问题,请post您的数据模型 - 不知道数据结构就很难优化。

附带说明一下,我会从事实 table 中删除 ID 字段。它不会为模型增加任何价值,并且会消耗大量内存。您的 objective 可以通过简单地计算行数来实现:

[Fact Count]:=CALCULATE(COUNTROWS('fact_table'),'Time_Dimension'[Last_month] <> "LAST")