在 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")
我有这个 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")