SQL Server Analysis Services
一个在决策支持和商业分析中使用的 Microsoft 联机分析数据引擎,它为商业报表和客户端应用程序(如 Power BI、Excel、报告服务报表和其他数据可视化工具)提供分析数据。
3 个问题
我不认为,现在https://learn.microsoft.com/zh-cn/dax/values-function-dax中的表述是准确的。其中尤其提到,VALUES和DISTINCT的区别,仅在于违反了引用完整性时提供的空白行。但我却发现了两者之间关于性能问题的巨大差异。
以下是我尝试复现性能问题的具体步骤:
我使用最新版的Power BI创建空白报表,使用输入数据方式创建了两张表格:
在语义模型中,将关联关系定义为一对多双向:
由于我手工输入的数据量有限,直接观察运算性能比较困难,所以我打开了DAX Studio,连到到这个实例,执行了下属两段查询:
这两段代码实际上是用于模拟DISTINCTCOUNTNOBLANK函数的行为,但我对它进行了结构,因为我发现真正的原因在于VALUES函数的奇怪行为。我观察到两者的查询计划有一处明显的差异:
我转到服务器时间页,我发现对于使用DISTINCT函数的查询,FE引擎将其拆分成了若干个SE任务,但对于使用VALUES的查询不会:
DISTINCTCOUNT和DISTINCTCOUNTNOBLANK函数与DISTINCT函数有着同样的行为,因此其性能在绝大多数情况下会比COUNTROWS套用VALUES更差;而VALUES函数为查询带来了独特的行为,在代码量增多的同时提高了性能,但我无法给出合理的解释。我希望在这里得到一个合理的解释,为什么一个单独的函数性能会比多个函数嵌套的性能更差?