在DAX中,VALUES函数的确切定义是什么?为什么DISTINCTCOUNTNOBLANK函数总是会表现出更差的性能?

T W 0 信誉分
2024-08-01T10:05:39.7633333+00:00

我不认为,现在https://learn.microsoft.com/zh-cn/dax/values-function-dax中的表述是准确的。其中尤其提到,VALUES和DISTINCT的区别,仅在于违反了引用完整性时提供的空白行。但我却发现了两者之间关于性能问题的巨大差异。

以下是我尝试复现性能问题的具体步骤:

我使用最新版的Power BI创建空白报表,使用输入数据方式创建了两张表格:

User's image

User's image

在语义模型中,将关联关系定义为一对多双向:

User's image

由于我手工输入的数据量有限,直接观察运算性能比较困难,所以我打开了DAX Studio,连到到这个实例,执行了下属两段查询:

  1. EVALUATE SUMMARIZE(M_Dim,M_Dim[Dim],"C",COUNTROWS(FILTER(VALUES(S_Cnt[Cnt]),NOT(ISBLANK([Cnt])))))
  2. EVALUATE SUMMARIZE(M_Dim,M_Dim[Dim],"C",COUNTROWS(FILTER(DISTINCT(S_Cnt[Cnt]),NOT(ISBLANK([Cnt])))))

这两段代码实际上是用于模拟DISTINCTCOUNTNOBLANK函数的行为,但我对它进行了结构,因为我发现真正的原因在于VALUES函数的奇怪行为。我观察到两者的查询计划有一处明显的差异:

User's image

User's image

我转到服务器时间页,我发现对于使用DISTINCT函数的查询,FE引擎将其拆分成了若干个SE任务,但对于使用VALUES的查询不会:

User's image

User's image

DISTINCTCOUNT和DISTINCTCOUNTNOBLANK函数与DISTINCT函数有着同样的行为,因此其性能在绝大多数情况下会比COUNTROWS套用VALUES更差;而VALUES函数为查询带来了独特的行为,在代码量增多的同时提高了性能,但我无法给出合理的解释。我希望在这里得到一个合理的解释,为什么一个单独的函数性能会比多个函数嵌套的性能更差?

SQL Server Analysis Services
SQL Server Analysis Services
一个在决策支持和商业分析中使用的 Microsoft 联机分析数据引擎,它为商业报表和客户端应用程序(如 Power BI、Excel、报告服务报表和其他数据可视化工具)提供分析数据。
3 个问题
0 个注释 无注释
{count} 票

你的答案

问题作者可以将答案标记为“接受的答案”,这有助于用户了解已解决作者问题的答案。